diff --git a/Build/Resources/Public/Sass/install.scss b/Build/Resources/Public/Sass/install.scss index 4f1ddf09fae991c0801a29dfd63d88a28353f95a..181b2bfcee48035fcf2a3b173866f91fca61fe36 100644 --- a/Build/Resources/Public/Sass/install.scss +++ b/Build/Resources/Public/Sass/install.scss @@ -20,6 +20,8 @@ $grid-float-breakpoint: $screen-md-min; @import "libs/chosen"; @import "libs/gridder"; @import "component/card"; +@import "component/colorpicker"; +@import "typo3/main_form"; // // Include elements diff --git a/typo3/sysext/backend/Classes/Controller/BackendController.php b/typo3/sysext/backend/Classes/Controller/BackendController.php index d1664da4f94531c78f34cd1f1b5c8b197a6f18d5..bd78f9d0f13b6941e21ae3154fb7321f60d6670b 100644 --- a/typo3/sysext/backend/Classes/Controller/BackendController.php +++ b/typo3/sysext/backend/Classes/Controller/BackendController.php @@ -21,6 +21,7 @@ use TYPO3\CMS\Backend\Module\ModuleLoader; use TYPO3\CMS\Backend\Routing\UriBuilder; use TYPO3\CMS\Backend\Toolbar\ToolbarItemInterface; use TYPO3\CMS\Backend\Utility\BackendUtility; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Restriction\BackendWorkspaceRestriction; use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction; @@ -280,7 +281,7 @@ class BackendController $view = $this->getFluidTemplateObject($this->partialPath . 'Backend/Topbar.html'); // Extension Configuration to find the TYPO3 logo in the left corner - $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['backend'], ['allowed_classes' => false]); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend'); $logoPath = ''; if (!empty($extConf['backendLogo'])) { $customBackendLogo = GeneralUtility::getFileAbsFileName($extConf['backendLogo']); diff --git a/typo3/sysext/backend/Classes/Controller/LoginController.php b/typo3/sysext/backend/Classes/Controller/LoginController.php index ee78ab0d4b21da6e599ad08f7f5bf97ecd1c231c..aa99e82ed938ec23e0eaf081409ccbedb2721bf1 100644 --- a/typo3/sysext/backend/Classes/Controller/LoginController.php +++ b/typo3/sysext/backend/Classes/Controller/LoginController.php @@ -21,6 +21,7 @@ use TYPO3\CMS\Backend\LoginProvider\LoginProviderInterface; use TYPO3\CMS\Backend\Routing\UriBuilder; use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\FormProtection\BackendFormProtection; use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; @@ -165,7 +166,7 @@ class LoginController $this->checkRedirect(); // Extension Configuration - $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['backend'], ['allowed_classes' => false]); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend'); // Background Image if (!empty($extConf['loginBackgroundImage'])) { diff --git a/typo3/sysext/backend/Classes/Template/DocumentTemplate.php b/typo3/sysext/backend/Classes/Template/DocumentTemplate.php index 9e528f65001ee4e1d47e35f35538ac1ff4a09fdb..5c0a75fc1ad699ac58110c6c8fcc3d71d3a134df 100644 --- a/typo3/sysext/backend/Classes/Template/DocumentTemplate.php +++ b/typo3/sysext/backend/Classes/Template/DocumentTemplate.php @@ -17,6 +17,7 @@ namespace TYPO3\CMS\Backend\Template; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerAwareTrait; use TYPO3\CMS\Backend\Utility\BackendUtility; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Page\PageRenderer; @@ -932,10 +933,9 @@ function jumpToUrl(URL) { */ protected function getBackendFavicon() { - $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['backend'], ['allowed_classes' => false]); - - if (!empty($extConf['backendFavicon'])) { - $path = $this->getUriForFileName($extConf['backendFavicon']); + $backendFavicon = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend', 'backendFavicon'); + if (!empty($backendFavicon)) { + $path = $this->getUriForFileName($backendFavicon); } else { $path = ExtensionManagementUtility::extPath('backend') . 'Resources/Public/Icons/favicon.ico'; } diff --git a/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationExtensionNotConfiguredException.php b/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationExtensionNotConfiguredException.php new file mode 100644 index 0000000000000000000000000000000000000000..2e07269a036771d33850b569482d76940e64b915 --- /dev/null +++ b/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationExtensionNotConfiguredException.php @@ -0,0 +1,27 @@ +<?php +namespace TYPO3\CMS\Core\Configuration\Exception; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Exception; + +/** + * An exception thrown if ExtensionConfiguration->get() is called for + * an extension that has no configuration. + * + * @internal + */ +class ExtensionConfigurationExtensionNotConfiguredException extends Exception +{ +} diff --git a/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationPathDoesNotExistException.php b/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationPathDoesNotExistException.php new file mode 100644 index 0000000000000000000000000000000000000000..bc3ee8a74620531f6ad74d9fdf06735264130ce0 --- /dev/null +++ b/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationPathDoesNotExistException.php @@ -0,0 +1,27 @@ +<?php +namespace TYPO3\CMS\Core\Configuration\Exception; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Exception; + +/** + * An exception thrown if ExtensionConfiguration->get() is called with + * a path that does not exist within the extension configuration. + * + * @internal + */ +class ExtensionConfigurationPathDoesNotExistException extends Exception +{ +} diff --git a/typo3/sysext/core/Classes/Configuration/ExtensionConfiguration.php b/typo3/sysext/core/Classes/Configuration/ExtensionConfiguration.php new file mode 100644 index 0000000000000000000000000000000000000000..0556885ea3952f6c1537f9dc7b87da580905f6a0 --- /dev/null +++ b/typo3/sysext/core/Classes/Configuration/ExtensionConfiguration.php @@ -0,0 +1,208 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Core\Configuration; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationExtensionNotConfiguredException; +use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationPathDoesNotExistException; +use TYPO3\CMS\Core\Utility\ArrayUtility; +use TYPO3\CMS\Core\Utility\GeneralUtility; + +/** + * API to get() and set() instance specific extension configuration options. + * + * Extension authors are encouraged to use this API - it is currently a simple + * wrapper to access TYPO3_CONF_VARS['EXTENSIONS'] but could later become something + * different in case core decides to store extension configuration elsewhere. + * + * Extension authors must not access TYPO3_CONF_VARS['EXTENSIONS'] on their own. + * + * Extension configurations are often 'feature flags' currently defined by + * ext_conf_template.txt files. The core (more specifically the install tool) + * takes care default values and overridden values are properly prepared upon + * loading or updating an extension. + */ +class ExtensionConfiguration +{ + /** + * Get a single configuration value, a sub array or the whole configuration. + * + * Examples: + * // Simple and typical usage: Get a single config value, or an array if the key is a "TypoScript" + * // a-like sub-path in ext_conf_template.txt "foo.bar = defaultValue" + * ->get('myExtension', 'aConfigKey'); + * + * // Get all current configuration values, always an array + * ->get('myExtension'); + * + * // Get a nested config value if the path is a "TypoScript" a-like sub-path + * // in ext_conf_template.txt "FE.forceSalted = defaultValue" + * ->get('myExtension', 'FE/forceSalted') + * + * Notes: + * - Return values are NOT type safe: A boolean false could be returned as string 0. + * Cast accordingly. + * - This API throws exceptions if the path does not exist or the extension + * configuration is not available. The install tool takes care any new + * ext_conf_template.txt values are available TYPO3_CONF_VARS['EXTENSIONS'], + * a thrown exception indicates a programming error on developer side + * and should not be caught. + * - It is not checked if the extension in question is loaded at all, + * it's just checked the extension configuration path exists. + * - Extensions should typically not get configuration of a different extension. + * + * @param string $extension Extension name + * @param string $path Configuration path - eg. "featureCategory/coolThingIsEnabled" + * @return mixed The value. Can be a sub array or a single value. + * @throws ExtensionConfigurationExtensionNotConfiguredException If ext configuration does no exist + * @throws ExtensionConfigurationPathDoesNotExistException If a requested extension path does not exist + * @api + */ + public function get(string $extension, string $path = '') + { + if (!isset($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extension]) || !is_array($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extension])) { + throw new ExtensionConfigurationExtensionNotConfiguredException( + 'No extension configuration for extension ' . $extension . ' found. Either this extension' + . ' has no extension configuration or the configuration is not up to date. Execute the' + . ' install tool to update configuration.', + 1509654728 + ); + } + if (empty($path)) { + return $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extension]; + } + if (!ArrayUtility::isValidPath($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'], $extension . '/' . $path)) { + throw new ExtensionConfigurationPathDoesNotExistException( + 'Path ' . $path . ' does not exist in extension configuration', + 1509977699 + ); + } + return ArrayUtility::getValueByPath($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'], $extension . '/' . $path); + } + + /** + * Store a new or overwrite an existing configuration value. + * + * This is typically used by core internal low level tasks like the install + * tool but may become handy if an extension needs to update extension configuration + * on the fly for whatever reason. + * + * Examples: + * // Enable a single feature + * ->set('myExtension', 'myFeature', true) + * + * // Set a full extension configuration ($value could be a nested array, too) + * ->set('myExtension', '', ['aFeature' => 'true', 'aCustomClass' => 'css-foo']) + * + * // Set a full sub path + * ->set('myExtension', 'myFeatureCategory', ['aFeature' => 'true', 'aCustomClass' => 'css-foo']) + * + * // Unset a whole extension configuration + * ->set('myExtension') + * + * // Unset a single value or sub path + * ->set('myExtension', 'myFeature') + * + * Notes: + * - $path is NOT validated. It is up to an ext author to also define them in + * ext_conf_template.txt to have an interface in install tool reflecting these settings + * - If $path is currently an array, $value overrides the whole thing. Merging existing values + * is up to the extension author + * - Values are not type safe, if the install tool wrote them, + * boolean true could become string 1 on ->get() + * - It is not possible to store 'null' as value, giving $value=null + * or no value at all will unset the path + * - Setting a value and calling ->get() afterwards will still return the old (!) value, the + * new value is only available in ->get() with next request. This is to have consistent + * values if the setting is possibly overwritten in AdditionalConfiguration again, which + * this API does not know and is only evaluated early during bootstrap. + * - Warning on AdditionalConfiguration.php: If this file overwrites settings, it spoils the + * ->set() call and values may not finally end up as expected. Avoid using AdditionalConfiguration.php + * in general ... + * + * @param string $extension Extension name + * @param string $path Configuration path to set - eg. "featureCategory/coolThingIsEnabled" + * @param null $value The value. If null, unset the path + * @api + */ + public function set(string $extension, string $path = '', $value = null) + { + if (empty($extension)) { + throw new \RuntimeException('extension name must not be empty', 1509715852); + } + $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); + if ($path === '' && $value === null) { + // Remove whole extension config + $configurationManager->removeLocalConfigurationKeysByPath([ 'EXTENSIONS/' . $extension ]); + } elseif ($path !== '' && $value === null) { + // Remove a single value or sub path + $configurationManager->removeLocalConfigurationKeysByPath([ 'EXTENSIONS/' . $extension . '/' . $path]); + } elseif ($path === '' && $value !== null) { + // Set full extension config + $configurationManager->setLocalConfigurationValueByPath('EXTENSIONS/' . $extension, $value); + } else { + // Set single path + $configurationManager->setLocalConfigurationValueByPath('EXTENSIONS/' . $extension . '/' . $path, $value); + } + + // After TYPO3_CONF_VARS['EXTENSIONS'] has been written, update legacy layer TYPO3_CONF_VARS['EXTENSIONS']['extConf'] + // @deprecated since TYPO3 v9, will be removed in v10 with removal of old serialized 'extConf' layer + $extensionsConfigs = $configurationManager->getConfigurationValueByPath('EXTENSIONS'); + foreach ($extensionsConfigs as $extensionName => $extensionConfig) { + $extensionConfig = $this->addDotsToArrayKeysRecursiveForLegacyExtConf($extensionConfig); + $configurationManager->setLocalConfigurationValueByPath('EXT/extConf/' . $extensionName, serialize($extensionConfig)); + } + } + + /** + * The old EXT/extConf layer had '.' (dots) at the end of all nested array keys. This is created here + * to keep EXT/extConf format compatible with old not yet adapted extensions. + * Most prominent usage is ext:saltedpasswords which uses sub keys like FE.forceSalted and BE.forceSalted, + * but extensions may rely on ending dots if using legacy unserialize() on their extensions, too. + * + * A EXTENSIONS array like: + * TYPO3_CONF_VARS['EXTENSIONS']['someExtension'] => [ + * 'someKey' => [ + * 'someSubKey' => [ + * 'someSubSubKey' => 'someValue', + * ], + * ], + * ] + * becomes (serialized) in old EXT/extConf (mind the dots and end of array keys for sub arrays): + * TYPO3_CONF_VARS['EXTENSIONS']['someExtension'] => [ + * 'someKey.' => [ + * 'someSubKey.' => [ + * 'someSubSubKey' => 'someValue', + * ], + * ], + * ] + * + * @param array $extensionConfig + * @return array + * @deprecated since TYPO3 v9, will be removed in v10 with removal of old serialized 'extConf' layer + */ + private function addDotsToArrayKeysRecursiveForLegacyExtConf(array $extensionConfig) + { + $newArray = []; + foreach ($extensionConfig as $key => $value) { + if (is_array($value)) { + $newArray[$key . '.'] = $this->addDotsToArrayKeysRecursiveForLegacyExtConf($value); + } else { + $newArray[$key] = $value; + } + } + return $newArray; + } +} diff --git a/typo3/sysext/core/Configuration/DefaultConfiguration.php b/typo3/sysext/core/Configuration/DefaultConfiguration.php index 5fa2e1572bb092af27e14f03be5507872cedfa80..919a20d5ee68b5cc2053243e406a0e59de3f5529 100644 --- a/typo3/sysext/core/Configuration/DefaultConfiguration.php +++ b/typo3/sysext/core/Configuration/DefaultConfiguration.php @@ -805,25 +805,26 @@ return [ 'allowGlobalInstall' => false, 'allowLocalInstall' => true, 'excludeForPackaging' => '(?:\\..*(?!htaccess)|.*~|.*\\.swp|.*\\.bak|\\.sass-cache|node_modules|bower_components)', - 'extConf' => [ - 'saltedpasswords' => serialize([ - 'BE.' => [ - 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, - 'forceSalted' => 0, - 'onlyAuthService' => 0, - 'updatePasswd' => 1, - ], - 'FE.' => [ - 'enabled' => 0, - 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, - 'forceSalted' => 0, - 'onlyAuthService' => 0, - 'updatePasswd' => 1, - ], - ]), - ], 'runtimeActivatedPackages' => [], ], + // Custom options shipped by extensions + 'EXTENSIONS' => [ + 'saltedpasswords' => [ + 'BE' => [ + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + 'FE' => [ + 'enabled' => 0, + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + ], + ], 'BE' => [ // Backend Configuration. 'languageDebug' => false, diff --git a/typo3/sysext/core/Configuration/FactoryConfiguration.php b/typo3/sysext/core/Configuration/FactoryConfiguration.php index b5474e2cd978c7c62c462b6ebca4c1c08039fdf8..dbac51c30cb9b573caa58988928df3faad749709 100644 --- a/typo3/sysext/core/Configuration/FactoryConfiguration.php +++ b/typo3/sysext/core/Configuration/FactoryConfiguration.php @@ -18,24 +18,45 @@ return [ ], ], ], - 'EXT' => [ - 'extConf' => [ - 'rsaauth' => 'a:1:{s:18:"temporaryDirectory";s:0:"";}', - 'saltedpasswords' => serialize([ - 'BE.' => [ - 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, - 'forceSalted' => 0, - 'onlyAuthService' => 0, - 'updatePasswd' => 1, - ], - 'FE.' => [ - 'enabled' => 1, - 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, - 'forceSalted' => 0, - 'onlyAuthService' => 0, - 'updatePasswd' => 1, - ], - ]), + 'EXTENSIONS' => [ + 'backend' => [ + 'backendFavicon' => '', + 'backendLogo' => '', + 'loginBackgroundImage' => '', + 'loginFootnote' => '', + 'loginHighlightColor' => '', + 'loginLogo' => '', + ], + 'extensionmanager' => [ + 'automaticInstallation' => 1, + 'offlineMode' => 0, + ], + 'rsaauth' => [ + 'temporaryDirectory' => '', + ], + 'saltedpasswords' => [ + 'BE' => [ + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + 'FE' => [ + 'enabled' => 1, + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + 'checkConfigurationBE' => '0', + 'checkConfigurationBE2' => '0', + 'checkConfigurationFE' => '0', + 'checkConfigurationFE2' => '0', + ], + 'scheduler' => [ + 'enableBELog' => 1, + 'maxLifetime' => 1440, + 'showSampleTasks' => 1, ], ], 'FE' => [ diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-82368-SignalAfterExtensionConfigurationWriteRemoved.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-82368-SignalAfterExtensionConfigurationWriteRemoved.rst new file mode 100644 index 0000000000000000000000000000000000000000..563eaa6691f8a6d154f91f867d64af1262ccaf7f --- /dev/null +++ b/typo3/sysext/core/Documentation/Changelog/master/Breaking-82368-SignalAfterExtensionConfigurationWriteRemoved.rst @@ -0,0 +1,36 @@ +.. include:: ../../Includes.txt + +==================================================================== +Breaking: #82368 - Signal 'afterExtensionConfigurationWrite' removed +==================================================================== + +See :issue:`82368` + +Description +=========== + +The extension manager no longer emits signal 'afterExtensionConfigurationWrite'. +The code has been moved to the install tool which does not load signal / slot +information at this point. + + +Impact +====== + +Slots of this signal are no longer executed. + + +Affected Installations +====================== + +Extensions that use signal 'afterExtensionConfigurationWrite'. This is a rather seldom +used signal, relevant mostly only for distributions. + + +Migration +========= + +In many cases it should be possible to use signal 'hasInstalledExtensions' instead +which is fired after an extension has been installed. + +.. index:: Backend, LocalConfiguration, PHP-API, NotScanned \ No newline at end of file diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82254-DeprecateGLOBALSTYPO3_CONF_VARSEXTextConf.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82254-DeprecateGLOBALSTYPO3_CONF_VARSEXTextConf.rst index ee96a3ab7a46f33cc2badee796141f0c8f9e9e26..e68362fdfd69699dd012d539edacd677cfe0c907 100644 --- a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82254-DeprecateGLOBALSTYPO3_CONF_VARSEXTextConf.rst +++ b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82254-DeprecateGLOBALSTYPO3_CONF_VARSEXTextConf.rst @@ -9,7 +9,9 @@ See :issue:`82254` Description =========== -The extension configuration stored in $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'] has been deprecated and replaced by a plain array in $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']. +The extension configuration stored in $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'] has been +deprecated and replaced by a plain array in $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']. A new +API has been introduced to retrieve extension configuration. Affected Installations @@ -21,6 +23,21 @@ All extensions manually getting settings and unserializing them from $GLOBALS['T Migration ========= -Switch to the use of $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'] instead and remove all unserialize calls. +Use a new API to retrieve extension configuration, examples: + +.. code-block:: php + + // Retrieve a single key + $backendFavicon = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend', 'backendFavicon'); + + // Retrieve whole configuration + $backendConfiguration = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend'); + + // Fully qualified class names for usage in ext_localconf.php / ext_tables.php + $backendConfiguration = (bool)\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( + \TYPO3\CMS\Core\Configuration\ExtensionConfiguration::class + )->get('backend'); + + .. index:: LocalConfiguration, PHP-API, FullyScanned diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-82254-StoreExtensionConfigurationAsPlainArray.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-82254-StoreExtensionConfigurationAsPlainArray.rst index 4e12dbd226e41f859328498aa2ba9e98f8bb46b7..d79d860afd1c77b8d02ceb01c1262f777461873b 100644 --- a/typo3/sysext/core/Documentation/Changelog/master/Feature-82254-StoreExtensionConfigurationAsPlainArray.rst +++ b/typo3/sysext/core/Documentation/Changelog/master/Feature-82254-StoreExtensionConfigurationAsPlainArray.rst @@ -9,14 +9,30 @@ See :issue:`82254` Description =========== -There is no reason to save the extension configuration as serialized values instead of an plain array. Arrays are easier to handle and there are already parts of the core using arrays (for example the avatar provider registration). +There is no reason to save the extension configuration as serialized values instead of +an plain array. Arrays are easier to handle and there are already parts of the core +using arrays (for example the avatar provider registration). -Therefore the API has been changed to store the extension configuration as an array in $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']. The configuration is merged on save with the default configuration and the full configuration is written to LocalConfiguration. +Therefore the API has been changed to store the extension configuration as an array +in $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']. The configuration is merged on save +with the default configuration and the full configuration is written to LocalConfiguration. Impact ====== -Extension configuration can now be accessed as array directly, without calling unserialize(). The old and new API will co-exist in version 9. +Extension configuration can now be accessed as array directly, without +calling unserialize(). The old and new API will co-exist in version 9. + +Use a new API to retrieve extension configuration, examples: + +.. code-block:: php + + // Retrieve a single key + $backendFavicon = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend', 'backendFavicon'); + + // Retrieve whole configuration + $backendConfiguration = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend'); + .. index:: LocalConfiguration, PHP-API diff --git a/typo3/sysext/core/Tests/Unit/Configuration/ExtensionConfigurationTest.php b/typo3/sysext/core/Tests/Unit/Configuration/ExtensionConfigurationTest.php new file mode 100644 index 0000000000000000000000000000000000000000..004596be39223afe1121c23004122599123d367d --- /dev/null +++ b/typo3/sysext/core/Tests/Unit/Configuration/ExtensionConfigurationTest.php @@ -0,0 +1,204 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Core\Tests\Unit\Configuration; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use Prophecy\Argument; +use TYPO3\CMS\Core\Configuration\ConfigurationManager; +use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationExtensionNotConfiguredException; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\TestingFramework\Core\Unit\UnitTestCase; + +/** + * Test case + */ +class ExtensionConfigurationTest extends UnitTestCase +{ + /** + * @test + */ + public function getThrowExceptionIfExtensionConfigurationDoesNotExist() + { + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['someOtherExtension']['someKey'] = 'someValue'; + $this->expectException(ExtensionConfigurationExtensionNotConfiguredException::class); + $this->expectExceptionCode(1509654728); + (new ExtensionConfiguration())->get('someExtension'); + } + + /** + * @test + */ + public function getWithEmptyPathReturnsEntireExtensionConfiguration() + { + $extConf = [ + 'aFeature' => 'iAmEnabled', + 'aFlagCategory' => [ + 'someFlag' => 'foo', + ], + ]; + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['someExtension'] = $extConf; + $this->assertSame((new ExtensionConfiguration())->get('someExtension'), $extConf); + } + + /** + * @test + */ + public function getWithPathReturnsGivenValue() + { + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['someExtension'] = [ + 'aFeature' => 'iAmEnabled', + 'aFlagCategory' => [ + 'someFlag' => 'foo', + ], + ]; + $this->assertSame((new ExtensionConfiguration())->get('someExtension', 'aFeature'), 'iAmEnabled'); + } + + /** + * @test + */ + public function getWithPathReturnsGivenPathSegment() + { + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['someExtension'] = [ + 'aFeature' => 'iAmEnabled', + 'aFlagCategory' => [ + 'someFlag' => 'foo', + ], + ]; + $this->assertSame((new ExtensionConfiguration())->get('someExtension', 'aFlagCategory'), ['someFlag' => 'foo']); + } + + /** + * @test + */ + public function setThrowsExceptionWithEmptyExtension() + { + $this->expectException(\RuntimeException::class); + $this->expectExceptionCode(1509715852); + (new ExtensionConfiguration())->set(''); + } + + /** + * @test + */ + public function setRemovesFullExtensionConfiguration() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->getConfigurationValueByPath(Argument::cetera())->willReturn([]); + $configurationManagerProphecy->removeLocalConfigurationKeysByPath(['EXTENSIONS/foo'])->shouldBeCalled(); + (new ExtensionConfiguration())->set('foo'); + } + + /** + * @test + */ + public function setRemovesPath() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->getConfigurationValueByPath(Argument::cetera())->willReturn([]); + $configurationManagerProphecy->removeLocalConfigurationKeysByPath(['EXTENSIONS/foo/bar'])->shouldBeCalled(); + (new ExtensionConfiguration())->set('foo', 'bar'); + } + + /** + * @test + */ + public function setWritesFullExtensionConfig() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->getConfigurationValueByPath(Argument::cetera())->willReturn([]); + $configurationManagerProphecy->setLocalConfigurationValueByPath('EXTENSIONS/foo', ['bar' => 'baz'])->shouldBeCalled(); + (new ExtensionConfiguration())->set('foo', '', ['bar' => 'baz']); + } + + /** + * @test + */ + public function setWritesPath() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->getConfigurationValueByPath(Argument::cetera())->willReturn([]); + $configurationManagerProphecy->setLocalConfigurationValueByPath('EXTENSIONS/foo/aPath', ['bar' => 'baz'])->shouldBeCalled(); + (new ExtensionConfiguration())->set('foo', 'aPath', ['bar' => 'baz']); + } + + /** + * @test + */ + public function setUpdatesLegacyExtConfToNewValues() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->setLocalConfigurationValueByPath(Argument::cetera())->shouldBeCalled(); + $configurationManagerProphecy->getConfigurationValueByPath('EXTENSIONS')->willReturn(['foo' => ['bar' => 'baz']]); + $configurationManagerProphecy->setLocalConfigurationValueByPath('EXT/extConf/foo', serialize(['bar' => 'baz']))->shouldBeCalled(); + (new ExtensionConfiguration())->set('foo', '', ['bar' => 'baz']); + } + + /** + * @test + */ + public function setUpdatesLegacyExtConfWithDottedArrayKeysForNestedConfiguration() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->setLocalConfigurationValueByPath(Argument::cetera())->shouldBeCalled(); + $nestedInput = [ + 'FE' => [ + 'forceSalted' => true, + ] + ]; + $expectedLegacyExtConf = [ + 'FE.' => [ + 'forceSalted' => true, + ] + ]; + $configurationManagerProphecy->getConfigurationValueByPath('EXTENSIONS')->willReturn(['saltedPasswords' => $nestedInput]); + $configurationManagerProphecy->setLocalConfigurationValueByPath('EXT/extConf/saltedPasswords', serialize($expectedLegacyExtConf))->shouldBeCalled(); + (new ExtensionConfiguration())->set('saltedPasswords', '', $nestedInput); + } + + /** + * @test + */ + public function setUpdatesLegacyExtConfWithDottedArrayKeysForNestedConfigurationWithMultiNestedArrays() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->setLocalConfigurationValueByPath(Argument::cetera())->shouldBeCalled(); + $nestedInput = [ + 'aCategory' => [ + 'aSubCategory' => [ + 'aKey' => 'aValue', + ], + ], + ]; + $expectedLegacyExtConf = [ + 'aCategory.' => [ + 'aSubCategory.' => [ + 'aKey' => 'aValue', + ], + ], + ]; + $configurationManagerProphecy->getConfigurationValueByPath('EXTENSIONS')->willReturn(['someExtension' => $nestedInput]); + $configurationManagerProphecy->setLocalConfigurationValueByPath('EXT/extConf/someExtension', serialize($expectedLegacyExtConf))->shouldBeCalled(); + (new ExtensionConfiguration())->set('someExtension', '', $nestedInput); + } +} diff --git a/typo3/sysext/extensionmanager/Classes/Controller/ConfigurationController.php b/typo3/sysext/extensionmanager/Classes/Controller/ConfigurationController.php deleted file mode 100644 index 495c5d8947be1ad2dfc09af0f31fa5cc99563a89..0000000000000000000000000000000000000000 --- a/typo3/sysext/extensionmanager/Classes/Controller/ConfigurationController.php +++ /dev/null @@ -1,221 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Controller; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Backend\Template\Components\ButtonBar; -use TYPO3\CMS\Backend\View\BackendTemplateView; -use TYPO3\CMS\Core\Imaging\Icon; -use TYPO3\CMS\Extbase\Mvc\View\ViewInterface; -use TYPO3\CMS\Extensionmanager\Domain\Model\Extension; -use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; - -/** - * Controller for configuration related actions. - */ -class ConfigurationController extends AbstractModuleController -{ - /** - * @var \TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository - */ - protected $configurationItemRepository; - - /** - * @var \TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository - */ - protected $extensionRepository; - - /** - * @param \TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository $configurationItemRepository - */ - public function injectConfigurationItemRepository(\TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository $configurationItemRepository) - { - $this->configurationItemRepository = $configurationItemRepository; - } - - /** - * @param \TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository $extensionRepository - */ - public function injectExtensionRepository(\TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository $extensionRepository) - { - $this->extensionRepository = $extensionRepository; - } - - /** - * Set up the doc header properly here - * - * @param ViewInterface $view - */ - protected function initializeView(ViewInterface $view) - { - if ($view instanceof BackendTemplateView) { - /** @var BackendTemplateView $view */ - parent::initializeView($view); - $this->generateMenu(); - $this->registerDocheaderButtons(); - } - } - - /** - * Show the extension configuration form. The whole form field handling is done - * in the corresponding view helper - * - * @param array $extension Extension information, must contain at least the key - * @throws \TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException - */ - public function showConfigurationFormAction(array $extension) - { - if (!isset($extension['key'])) { - throw new ExtensionManagerException('Extension key not found.', 1359206803); - } - $this->handleTriggerArguments(); - - $extKey = $extension['key']; - $configuration = $this->configurationItemRepository->findByExtensionKey($extKey); - if ($configuration) { - $this->view - ->assign('configuration', $configuration) - ->assign('extension', $extension); - } else { - throw new ExtensionManagerException('The extension ' . $extKey . ' has no configuration.', 1476047775); - } - } - - /** - * Save configuration and redirects back to form - * or to the show page of a distribution - * - * @param array $config The new extension configuration - * @param string $extensionKey The extension key - */ - public function saveAction(array $config, $extensionKey) - { - $this->saveConfiguration($config, $extensionKey); - /** @var Extension $extension */ - $extension = $this->extensionRepository->findOneByCurrentVersionByExtensionKey($extensionKey); - // Different handling for distribution installation - if ($extension instanceof Extension && - $extension->getCategory() === Extension::DISTRIBUTION_CATEGORY - ) { - $this->redirect('show', 'Distribution', null, ['extension' => $extension->getUid()]); - } else { - $this->redirect('showConfigurationForm', null, null, [ - 'extension' => [ - 'key' => $extensionKey - ], - self::TRIGGER_RefreshTopbar => true - ]); - } - } - - /** - * Saves new configuration and redirects back to list - * - * @param array $config - * @param string $extensionKey - */ - public function saveAndCloseAction(array $config, $extensionKey) - { - $this->saveConfiguration($config, $extensionKey); - $this->redirect('index', 'List', null, [ - self::TRIGGER_RefreshTopbar => true - ]); - } - - /** - * Emits a signal after the configuration file was written - * - * @param string $extensionKey - * @param array $newConfiguration - */ - protected function emitAfterExtensionConfigurationWriteSignal($extensionKey, array $newConfiguration) - { - $this->signalSlotDispatcher->dispatch(__CLASS__, 'afterExtensionConfigurationWrite', [$extensionKey, $newConfiguration, $this]); - } - - /** - * Merge and save new configuration - * - * @param array $config - * @param $extensionKey - */ - protected function saveConfiguration(array $config, $extensionKey) - { - /** @var $configurationUtility \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility */ - $configurationUtility = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class); - $newConfiguration = $configurationUtility->getCurrentConfiguration($extensionKey); - \TYPO3\CMS\Core\Utility\ArrayUtility::mergeRecursiveWithOverrule($newConfiguration, $config); - $configurationUtility->writeConfiguration( - $configurationUtility->convertValuedToNestedConfiguration($newConfiguration), - $extensionKey - ); - $this->emitAfterExtensionConfigurationWriteSignal($extensionKey, $newConfiguration); - } - - /** - * Registers the Icons into the docheader - * - * @throws \InvalidArgumentException - */ - protected function registerDocheaderButtons() - { - $moduleTemplate = $this->view->getModuleTemplate(); - $lang = $this->getLanguageService(); - - /** @var ButtonBar $buttonBar */ - $buttonBar = $moduleTemplate->getDocHeaderComponent()->getButtonBar(); - - $uriBuilder = $this->controllerContext->getUriBuilder(); - $uri = $uriBuilder->reset()->uriFor('index', [], 'List'); - - $icon = $this->view->getModuleTemplate()->getIconFactory()->getIcon('actions-view-go-back', Icon::SIZE_SMALL); - $goBackButton = $buttonBar->makeLinkButton() - ->setHref($uri) - ->setTitle($this->translate('extConfTemplate.backToList')) - ->setIcon($icon); - $buttonBar->addButton($goBackButton, ButtonBar::BUTTON_POSITION_LEFT); - - $saveSplitButton = $buttonBar->makeSplitButton(); - // SAVE button: - $saveButton = $buttonBar->makeInputButton() - ->setName('_savedok') - ->setValue('1') - ->setTitle($lang->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:rm.saveDoc')) - ->setForm('configurationform') - ->setIcon($moduleTemplate->getIconFactory()->getIcon('actions-document-save', Icon::SIZE_SMALL)); - $saveSplitButton->addItem($saveButton, true); - - // SAVE / CLOSE - $saveAndCloseButton = $buttonBar->makeInputButton() - ->setName('_saveandclosedok') - ->setClasses('t3js-save-close') - ->setValue('1') - ->setTitle($lang->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:rm.saveCloseDoc')) - ->setForm('configurationform') - ->setIcon($moduleTemplate->getIconFactory()->getIcon( - 'actions-document-save-close', - Icon::SIZE_SMALL - )); - $saveSplitButton->addItem($saveAndCloseButton); - $buttonBar->addButton($saveSplitButton, ButtonBar::BUTTON_POSITION_LEFT, 2); - } - - /** - * @return \TYPO3\CMS\Core\Localization\LanguageService - */ - protected function getLanguageService() - { - return $GLOBALS['LANG']; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/Controller/DistributionController.php b/typo3/sysext/extensionmanager/Classes/Controller/DistributionController.php index 7d4660df2ad63c44b1410a2f09b06a99a359cd85..cb0f05c654ca7ab2590fb79ce56ded4f70d03c65 100644 --- a/typo3/sysext/extensionmanager/Classes/Controller/DistributionController.php +++ b/typo3/sysext/extensionmanager/Classes/Controller/DistributionController.php @@ -62,20 +62,7 @@ class DistributionController extends AbstractModuleController // Check if extension/package is installed $active = $this->packageManager->isPackageActive($extensionKey); - // Create link for extension configuration - if ($active && file_exists(\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath($extensionKey) . 'ext_conf_template.txt')) { - $uriBuilder = $this->controllerContext->getUriBuilder(); - $action = 'showConfigurationForm'; - $configurationLink = $uriBuilder->reset()->uriFor( - $action, - ['extension' => ['key' => $extensionKey]], - 'Configuration' - ); - } else { - $configurationLink = false; - } $this->view->assign('distributionActive', $active); - $this->view->assign('configurationLink', $configurationLink); $this->view->assign('extension', $extension); } diff --git a/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php b/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php index 35924b3190d5b2fb80d7c6154c1d21a9d5b5905c..ef5692967367931ccb3dac51b262515371258687 100644 --- a/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php +++ b/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php @@ -14,7 +14,9 @@ namespace TYPO3\CMS\Extensionmanager\Controller; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Messaging\FlashMessage; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\View\JsonView; use TYPO3\CMS\Extensionmanager\Domain\Model\Extension; @@ -48,11 +50,6 @@ class DownloadController extends AbstractController */ protected $downloadUtility; - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - /** * @var JsonView */ @@ -103,14 +100,6 @@ class DownloadController extends AbstractController $this->downloadUtility = $downloadUtility; } - /** - * @param \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility - */ - public function injectConfigurationUtility(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility) - { - $this->configurationUtility = $configurationUtility; - } - /** * Defines which view object should be used for the installFromTer action */ @@ -137,7 +126,11 @@ class DownloadController extends AbstractController 'dependencies' => [], ], ]; - if ($this->configurationUtility->getCurrentConfiguration('extensionmanager')['automaticInstallation']['value']) { + $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'automaticInstallation'); + if (!$isAutomaticInstallationEnabled) { + // if automatic installation is deactivated, no dependency check is needed (download only) + $action = 'installExtensionWithoutSystemDependencyCheck'; + } else { $action = 'installFromTer'; try { $dependencyTypes = $this->managementService->getAndResolveDependencies($extension); @@ -177,9 +170,6 @@ class DownloadController extends AbstractController $title = $this->translate('downloadExtension.dependencies.errorTitle'); $message = $e->getMessage(); } - } else { - // if automatic installation is deactivated, no dependency check is needed (download only) - $action = 'installExtensionWithoutSystemDependencyCheck'; } $url = $this->uriBuilder->uriFor( @@ -207,11 +197,11 @@ class DownloadController extends AbstractController public function installFromTerAction(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension $extension, $downloadPath = 'Local') { list($result, $errorMessages) = $this->installFromTer($extension, $downloadPath); - $emConfiguration = $this->configurationUtility->getCurrentConfiguration('extensionmanager'); + $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'automaticInstallation'); $this->view ->assign('result', $result) ->assign('extension', $extension) - ->assign('installationTypeLanguageKey', (bool)$emConfiguration['automaticInstallation']['value'] ? '' : '.downloadOnly') + ->assign('installationTypeLanguageKey', $isAutomaticInstallationEnabled ? '' : '.downloadOnly') ->assign('unresolvedDependencies', $errorMessages); } @@ -362,7 +352,8 @@ class DownloadController extends AbstractController $errorMessages = []; try { $this->downloadUtility->setDownloadPath($downloadPath); - $this->managementService->setAutomaticInstallationEnabled($this->configurationUtility->getCurrentConfiguration('extensionmanager')['automaticInstallation']['value']); + $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'automaticInstallation'); + $this->managementService->setAutomaticInstallationEnabled($isAutomaticInstallationEnabled); if (($result = $this->managementService->installExtension($extension)) === false) { $errorMessages = $this->managementService->getDependencyErrors(); } diff --git a/typo3/sysext/extensionmanager/Classes/Controller/ListController.php b/typo3/sysext/extensionmanager/Classes/Controller/ListController.php index f2c3c7aceffeddcc8a09d63d08bf1425b62dbd5a..ee201524a7a41a9f6a730dc59377d455863bb77a 100644 --- a/typo3/sysext/extensionmanager/Classes/Controller/ListController.php +++ b/typo3/sysext/extensionmanager/Classes/Controller/ListController.php @@ -16,10 +16,12 @@ namespace TYPO3\CMS\Extensionmanager\Controller; use TYPO3\CMS\Backend\Template\Components\ButtonBar; use TYPO3\CMS\Backend\View\BackendTemplateView; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Core\Bootstrap; use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\View\ViewInterface; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; @@ -51,11 +53,6 @@ class ListController extends AbstractModuleController */ protected $dependencyUtility; - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - /** * @param \TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository $extensionRepository */ @@ -88,21 +85,14 @@ class ListController extends AbstractModuleController $this->dependencyUtility = $dependencyUtility; } - /** - * @param \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility - */ - public function injectConfigurationUtility(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility) - { - $this->configurationUtility = $configurationUtility; - } - /** * Add the needed JavaScript files for all actions */ public function initializeAction() { $this->pageRenderer->addInlineLanguageLabelFile('EXT:extensionmanager/Resources/Private/Language/locallang.xlf'); - if ($this->configurationUtility->getCurrentConfiguration('extensionmanager')['offlineMode']['value']) { + $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'offlineMode'); + if ($isAutomaticInstallationEnabled) { $this->settings['offlineMode'] = true; } } diff --git a/typo3/sysext/extensionmanager/Classes/Controller/UploadExtensionFileController.php b/typo3/sysext/extensionmanager/Classes/Controller/UploadExtensionFileController.php index c225fa536f5e328fbabdc897b89874e564ea9662..0daa0a89b5eef96e0c52cddda449837e5191a443 100644 --- a/typo3/sysext/extensionmanager/Classes/Controller/UploadExtensionFileController.php +++ b/typo3/sysext/extensionmanager/Classes/Controller/UploadExtensionFileController.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Extensionmanager\Controller; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Core\Bootstrap; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -26,11 +27,6 @@ use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; */ class UploadExtensionFileController extends AbstractController { - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - /** * @var \TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository */ @@ -61,14 +57,6 @@ class UploadExtensionFileController extends AbstractController */ protected $removeFromOriginalPath = false; - /** - * @param \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility - */ - public function injectConfigurationUtility(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility) - { - $this->configurationUtility = $configurationUtility; - } - /** * @param \TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository $extensionRepository */ @@ -150,8 +138,8 @@ class UploadExtensionFileController extends AbstractController ); } $extensionData = $this->extractExtensionFromFile($tempFile, $fileName, $overwrite); - $emConfiguration = $this->configurationUtility->getCurrentConfiguration('extensionmanager'); - if (!$emConfiguration['automaticInstallation']['value']) { + $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'offlineMode'); + if (!$isAutomaticInstallationEnabled) { $this->addFlashMessage( $this->translate('extensionList.uploadFlashMessage.message', [$extensionData['extKey']]), $this->translate('extensionList.uploadFlashMessage.title'), diff --git a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationCategory.php b/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationCategory.php deleted file mode 100644 index 97457e65b1159832c5e2c9b9a466fe206711e677..0000000000000000000000000000000000000000 --- a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationCategory.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Domain\Model; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -/** - * Main model for extension configuration categories - */ -class ConfigurationCategory extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity -{ - /** - * @var string - */ - protected $name = ''; - - /** - * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationSubcategory> - */ - protected $subcategories; - - /** - * Constructs this Category - */ - public function __construct() - { - $this->subcategories = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage(); - } - - /** - * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $subcategories - */ - public function setSubcategories($subcategories) - { - $this->subcategories = $subcategories; - } - - /** - * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage - */ - public function getSubcategories() - { - return $this->subcategories; - } - - /** - * Adds a subcategories - * - * @param \TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationSubcategory $subcategory - */ - public function addSubcategory(\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationSubcategory $subcategory) - { - $this->subcategories->attach($subcategory); - } - - /** - * @param string $name - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationItem.php b/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationItem.php deleted file mode 100644 index 7af7ed0257e1c60e06a3412594a3bfab2793d8f6..0000000000000000000000000000000000000000 --- a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationItem.php +++ /dev/null @@ -1,189 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Domain\Model; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -/** - * Model for extension configuration items - */ -class ConfigurationItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity -{ - /** - * @var string - */ - protected $category = ''; - - /** - * @var string - */ - protected $subCategory = ''; - - /** - * @var string - */ - protected $type = ''; - - /** - * @var string - */ - protected $labelHeadline = ''; - - /** - * @var string - */ - protected $labelText = ''; - - /** - * @var mixed - */ - protected $generic = ''; - - /** - * @var string - */ - protected $name = ''; - - /** - * @var string - */ - protected $value = ''; - - /** - * @param string $category - */ - public function setCategory($category) - { - $this->category = $category; - } - - /** - * @return string - */ - public function getCategory() - { - return $this->category; - } - - /** - * @param string $labelHeadline - */ - public function setLabelHeadline($labelHeadline) - { - $this->labelHeadline = $labelHeadline; - } - - /** - * @return string - */ - public function getLabelHeadline() - { - return $this->labelHeadline; - } - - /** - * @param string $labelText - */ - public function setLabelText($labelText) - { - $this->labelText = $labelText; - } - - /** - * @return string - */ - public function getLabelText() - { - return $this->labelText; - } - - /** - * @param string $subCategory - */ - public function setSubCategory($subCategory) - { - $this->subCategory = $subCategory; - } - - /** - * @return string - */ - public function getSubCategory() - { - return $this->subCategory; - } - - /** - * @param string $type - */ - public function setType($type) - { - $this->type = $type; - } - - /** - * @return string - */ - public function getType() - { - return $this->type; - } - - /** - * @param mixed $userFunc - */ - public function setGeneric($userFunc) - { - $this->generic = $userFunc; - } - - /** - * @return mixed - */ - public function getGeneric() - { - return $this->generic; - } - - /** - * @param string $name - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * @param string $value - */ - public function setValue($value) - { - $this->value = $value; - } - - /** - * @return string - */ - public function getValue() - { - return $this->value; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationSubcategory.php b/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationSubcategory.php deleted file mode 100644 index e02ad532be6f4de768191e188596f73a07c2bf4d..0000000000000000000000000000000000000000 --- a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationSubcategory.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Domain\Model; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -/** - * Model for configuration sub categories - * - * Configuration options can be structured with categories and sub categories. - * Categories are usually displayed as tabs and sub categories are used to - * group configuration items in one tab. - */ -class ConfigurationSubcategory extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity -{ - /** - * @var string - */ - protected $name = ''; - - /** - * @var string The sub category label - */ - protected $label = ''; - - /** - * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem> - */ - protected $items; - - /** - * Constructs this Category - */ - public function __construct() - { - $this->items = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage(); - } - - /** - * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $items - */ - public function setItems($items) - { - $this->items = $items; - } - - /** - * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage - */ - public function getItems() - { - return $this->items; - } - - /** - * Adds a subcategory - * - * @param \TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem $item - */ - public function addItem(\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem $item) - { - $this->items->attach($item); - } - - /** - * @param string $name - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Set sub category label - * - * @param string $label - */ - public function setLabel($label) - { - $this->label = $label; - } - - /** - * Get sub category label - * - * @return string - */ - public function getLabel() - { - return $this->label; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/Domain/Repository/ConfigurationItemRepository.php b/typo3/sysext/extensionmanager/Classes/Domain/Repository/ConfigurationItemRepository.php deleted file mode 100644 index 702ab4fd6007e2b0e75e5765824656d254429ef3..0000000000000000000000000000000000000000 --- a/typo3/sysext/extensionmanager/Classes/Domain/Repository/ConfigurationItemRepository.php +++ /dev/null @@ -1,230 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Domain\Repository; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Utility\ArrayUtility; -use TYPO3\CMS\Core\Utility\GeneralUtility; - -/** - * A repository for extension configuration items - */ -class ConfigurationItemRepository -{ - /** - * @var \TYPO3\CMS\Extbase\Object\ObjectManagerInterface - */ - protected $objectManager; - - /** - * @param \TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager - */ - public function injectObjectManager(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager) - { - $this->objectManager = $objectManager; - } - - /** - * Find configuration options by extension - * - * @param string $extensionKey Extension key - * @return \SplObjectStorage - */ - public function findByExtensionKey($extensionKey) - { - $configurationArray = $this->getConfigurationArrayFromExtensionKey($extensionKey); - return $this->convertHierarchicArrayToObject($configurationArray); - } - - /** - * Converts the raw configuration file content to an configuration object storage - * - * @param string $extensionKey Extension key - * @return array - */ - protected function getConfigurationArrayFromExtensionKey($extensionKey) - { - /** @var $configurationUtility \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility */ - $configurationUtility = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class); - $configuration = $configurationUtility->getCurrentConfiguration($extensionKey); - - $resultArray = []; - if (!empty($configuration)) { - $hierarchicConfiguration = []; - foreach ($configuration as $configurationOption) { - $originalConfiguration = $this->buildConfigurationArray($configurationOption, $extensionKey); - ArrayUtility::mergeRecursiveWithOverrule($originalConfiguration, $hierarchicConfiguration); - $hierarchicConfiguration = $originalConfiguration; - } - - // Flip category array as it was merged the other way around - $hierarchicConfiguration = array_reverse($hierarchicConfiguration); - - // Sort configurations of each subcategory - foreach ($hierarchicConfiguration as &$catConfigurationArray) { - foreach ($catConfigurationArray as &$subcatConfigurationArray) { - uasort($subcatConfigurationArray, function ($a, $b) { - return strnatcmp($a['subcat'], $b['subcat']); - }); - } - unset($subcatConfigurationArray); - } - unset($tempConfiguration); - $resultArray = $hierarchicConfiguration; - } - - return $resultArray; - } - - /** - * Builds a configuration array from each line (option) of the config file - * - * @param string $configurationOption config file line representing one setting - * @param string $extensionKey Extension key - * @return array - */ - protected function buildConfigurationArray($configurationOption, $extensionKey) - { - $hierarchicConfiguration = []; - if (GeneralUtility::isFirstPartOfStr($configurationOption['type'], 'user')) { - $configurationOption = $this->extractInformationForConfigFieldsOfTypeUser($configurationOption); - } elseif (GeneralUtility::isFirstPartOfStr($configurationOption['type'], 'options')) { - $configurationOption = $this->extractInformationForConfigFieldsOfTypeOptions($configurationOption); - } - if ($this->translate($configurationOption['label'], $extensionKey)) { - $configurationOption['label'] = $this->translate($configurationOption['label'], $extensionKey); - } - $configurationOption['labels'] = GeneralUtility::trimExplode(':', $configurationOption['label'], false, 2); - $configurationOption['subcat_name'] = $configurationOption['subcat_name'] ?: '__default'; - $hierarchicConfiguration[$configurationOption['cat']][$configurationOption['subcat_name']][$configurationOption['name']] = $configurationOption; - return $hierarchicConfiguration; - } - - /** - * Extracts additional information for fields of type "options" - * Extracts "type", "label" and values information - * - * @param array $configurationOption - * @return array - */ - protected function extractInformationForConfigFieldsOfTypeOptions(array $configurationOption) - { - preg_match('/options\[(.*)\]/is', $configurationOption['type'], $typeMatches); - $optionItems = GeneralUtility::trimExplode(',', $typeMatches[1]); - foreach ($optionItems as $optionItem) { - $optionPair = GeneralUtility::trimExplode('=', $optionItem); - if (count($optionPair) === 2) { - $configurationOption['generic'][$optionPair[0]] = $optionPair[1]; - } else { - $configurationOption['generic'][$optionPair[0]] = $optionPair[0]; - } - } - $configurationOption['type'] = 'options'; - return $configurationOption; - } - - /** - * Extract additional information for fields of type "user" - * Extracts "type" and the function to be called - * - * @param array $configurationOption - * @return array - */ - protected function extractInformationForConfigFieldsOfTypeUser(array $configurationOption) - { - preg_match('/user\\[(.*)\\]/is', $configurationOption['type'], $matches); - $configurationOption['generic'] = $matches[1]; - $configurationOption['type'] = 'user'; - return $configurationOption; - } - - /** - * Converts a hierarchic configuration array to an - * hierarchic object storage structure - * - * @param array $configuration - * @return \SplObjectStorage - */ - protected function convertHierarchicArrayToObject(array $configuration) - { - $configurationObjectStorage = new \SplObjectStorage(); - foreach ($configuration as $category => $subcategory) { - /** @var $configurationCategoryObject \TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationCategory */ - $configurationCategoryObject = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationCategory::class); - $configurationCategoryObject->setName($category); - foreach ($subcategory as $subcatName => $configurationItems) { - /** @var $configurationSubcategoryObject \TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationSubcategory */ - $configurationSubcategoryObject = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationSubcategory::class); - $configurationSubcategoryObject->setName($subcatName); - foreach ($configurationItems as $configurationItem) { - // Set sub category label if configuration item contains a subcat label. - // The sub category label is set multiple times if there is more than one item - // in a sub category, but that is ok since all items of one sub category - // share the same label. - if (array_key_exists('subcat_label', $configurationItem)) { - $configurationSubcategoryObject->setLabel($configurationItem['subcat_label']); - } - - /** @var $configurationObject \TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem */ - $configurationObject = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem::class); - if (isset($configurationItem['generic'])) { - $configurationObject->setGeneric($configurationItem['generic']); - } - if (isset($configurationItem['cat'])) { - $configurationObject->setCategory($configurationItem['cat']); - } - if (isset($configurationItem['subcat_name'])) { - $configurationObject->setSubCategory($configurationItem['subcat_name']); - } - if (isset($configurationItem['labels']) && isset($configurationItem['labels'][0])) { - $configurationObject->setLabelHeadline($configurationItem['labels'][0]); - } - if (isset($configurationItem['labels']) && isset($configurationItem['labels'][1])) { - $configurationObject->setLabelText($configurationItem['labels'][1]); - } - if (isset($configurationItem['type'])) { - $configurationObject->setType($configurationItem['type']); - } - if (isset($configurationItem['name'])) { - $configurationObject->setName($configurationItem['name']); - } - if (isset($configurationItem['value'])) { - $configurationObject->setValue($configurationItem['value']); - } - $configurationSubcategoryObject->addItem($configurationObject); - } - $configurationCategoryObject->addSubcategory($configurationSubcategoryObject); - } - $configurationObjectStorage->attach($configurationCategoryObject); - } - return $configurationObjectStorage; - } - - /** - * Returns the localized label of the LOCAL_LANG key, $key. - * Wrapper for the static call. - * - * @param string $key The key from the LOCAL_LANG array for which to return the value. - * @param string $extensionName The name of the extension - * @return string|null The value from LOCAL_LANG or NULL if no translation was found. - */ - protected function translate($key, $extensionName) - { - $translation = \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate($key, $extensionName); - if ($translation) { - return $translation; - } - return null; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/Utility/Connection/TerUtility.php b/typo3/sysext/extensionmanager/Classes/Utility/Connection/TerUtility.php index d15d62fd2d933987e1bfc22e6798a5630a10369b..59a67593ba438909649207df0778572bc22add59 100644 --- a/typo3/sysext/extensionmanager/Classes/Utility/Connection/TerUtility.php +++ b/typo3/sysext/extensionmanager/Classes/Utility/Connection/TerUtility.php @@ -14,7 +14,9 @@ namespace TYPO3\CMS\Extensionmanager\Utility\Connection; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Core\Bootstrap; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; /** @@ -29,19 +31,6 @@ class TerUtility */ public $wsdlUrl; - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - - /** - * @param \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility - */ - public function injectConfigurationUtility(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility) - { - $this->configurationUtility = $configurationUtility; - } - /** * Fetches an extension from the given mirror * @@ -55,7 +44,7 @@ class TerUtility public function fetchExtension($extensionKey, $version, $expectedMd5, $mirrorUrl) { if ( - !empty($this->configurationUtility->getCurrentConfiguration('extensionmanager')['offlineMode']['value']) + (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'offlineMode') || Bootstrap::usesComposerClassLoading() ) { throw new ExtensionManagerException('Extension Manager is in offline mode. No TER connection available.', 1437078620); diff --git a/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php b/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php index 091c8c7047e091a0676bbde088a81c6ea06ff541..f335ec38f366e6ce47d62cfeabfc55b91e3c14f7 100644 --- a/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php +++ b/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php @@ -21,6 +21,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extensionmanager\Domain\Model\Extension; use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; use TYPO3\CMS\Impexp\Utility\ImportExportUtility; +use TYPO3\CMS\Install\Service\ExtensionConfigurationService; /** * Extension Manager Install Utility @@ -438,9 +439,8 @@ class InstallUtility implements \TYPO3\CMS\Core\SingletonInterface */ protected function saveDefaultConfiguration($extensionKey) { - /** @var $configUtility \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility */ - $configUtility = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class); - $configUtility->saveDefaultConfiguration($extensionKey); + $configUtility = $this->objectManager->get(ExtensionConfigurationService::class); + $configUtility->synchronizeExtConfTemplateWithLocalConfiguration($extensionKey); } /** diff --git a/typo3/sysext/extensionmanager/Classes/Utility/Repository/Helper.php b/typo3/sysext/extensionmanager/Classes/Utility/Repository/Helper.php index 6ef7248b2e57245a098d8ea094a4fa5f500a786e..6b21f0e92b0856bdea96042df6ae6f24775be7b1 100644 --- a/typo3/sysext/extensionmanager/Classes/Utility/Repository/Helper.php +++ b/typo3/sysext/extensionmanager/Classes/Utility/Repository/Helper.php @@ -14,10 +14,10 @@ namespace TYPO3\CMS\Extensionmanager\Utility\Repository; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; -use TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility; /** * Central utility class for repository handling. @@ -64,11 +64,6 @@ class Helper implements \TYPO3\CMS\Core\SingletonInterface */ protected $extensionRepository; - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - /** * Class constructor. * @@ -81,7 +76,6 @@ class Helper implements \TYPO3\CMS\Core\SingletonInterface /** @var \TYPO3\CMS\Extensionmanager\Domain\Repository\RepositoryRepository $repositoryRepository */ $repositoryRepository = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Domain\Repository\RepositoryRepository::class); $this->extensionRepository = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository::class); - $this->configurationUtility = $this->objectManager->get(ConfigurationUtility::class); /** @var \TYPO3\CMS\Extensionmanager\Domain\Model\Repository $repository */ $repository = $repositoryRepository->findByUid(1); if (is_object($repository)) { @@ -142,7 +136,8 @@ class Helper implements \TYPO3\CMS\Core\SingletonInterface */ protected function fetchFile($remoteResource, $localResource) { - if ($this->configurationUtility->getCurrentConfiguration('extensionmanager')['offlineMode']['value']) { + $isOffline = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'offlineMode'); + if ($isOffline) { throw new ExtensionManagerException('Extension Manager is in offline mode. No TER connection available.', 1437078780); } if (is_string($remoteResource) && is_string($localResource) && !empty($remoteResource) && !empty($localResource)) { diff --git a/typo3/sysext/extensionmanager/Classes/ViewHelpers/ConfigureExtensionViewHelper.php b/typo3/sysext/extensionmanager/Classes/ViewHelpers/ConfigureExtensionViewHelper.php deleted file mode 100644 index 71ac2beb4d1cadaf28fdf62736b97791e3441dd6..0000000000000000000000000000000000000000 --- a/typo3/sysext/extensionmanager/Classes/ViewHelpers/ConfigureExtensionViewHelper.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\ViewHelpers; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Imaging\Icon; -use TYPO3\CMS\Core\Imaging\IconFactory; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Extbase\Utility\LocalizationUtility; - -/** - * View helper for configure extension link - * @internal - */ -class ConfigureExtensionViewHelper extends Link\ActionViewHelper -{ - /** - * Initialize arguments - */ - public function initializeArguments() - { - parent::initializeArguments(); - $this->registerArgument('extension', 'array', 'Extension configuration array with extension information', true); - $this->registerArgument('forceConfiguration', 'bool', 'If TRUE the content is only returned if a link could be generated', false, true); - $this->registerArgument('showDescription', 'bool', 'If TRUE the extension description is also shown in the title attribute', false, false); - } - - /** - * Renders a configure extension link if the extension has configuration options - * - * @return string the rendered tag or child nodes content - */ - public function render() - { - $extension = $this->arguments['extension']; - $forceConfiguration = $this->arguments['forceConfiguration']; - $showDescription = $this->arguments['showDescription']; - - $content = (string)$this->renderChildren(); - if ($extension['installed'] && file_exists(PATH_site . $extension['siteRelPath'] . 'ext_conf_template.txt')) { - $uriBuilder = $this->renderingContext->getControllerContext()->getUriBuilder(); - $action = 'showConfigurationForm'; - $uri = $uriBuilder->reset()->uriFor( - $action, - ['extension' => ['key' => $extension['key']]], - 'Configuration' - ); - if ($showDescription) { - $title = $extension['description'] . PHP_EOL . - LocalizationUtility::translate('extensionList.clickToConfigure', 'extensionmanager'); - } else { - $title = LocalizationUtility::translate('extensionList.configure', 'extensionmanager'); - } - $this->tag->addAttribute('href', $uri); - $this->tag->addAttribute('title', $title); - $this->tag->setContent($content); - $content = $this->tag->render(); - } elseif ($forceConfiguration) { - $iconFactory = GeneralUtility::makeInstance(IconFactory::class); - $content = '<span class="btn btn-default disabled">' . $iconFactory->getIcon('empty-empty', Icon::SIZE_SMALL)->render() . '</span>'; - } else { - $content = '<span title="' . htmlspecialchars($extension['description']) . '">' . $content . '</span>'; - } - - return $content; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/ViewHelpers/DownloadExtensionViewHelper.php b/typo3/sysext/extensionmanager/Classes/ViewHelpers/DownloadExtensionViewHelper.php index 5c8a92bd6a8e28c62f2aa90f6507bb0cdef3f9a5..365a0a0044f9f95370e68030cf682354fbfa43d7 100644 --- a/typo3/sysext/extensionmanager/Classes/ViewHelpers/DownloadExtensionViewHelper.php +++ b/typo3/sysext/extensionmanager/Classes/ViewHelpers/DownloadExtensionViewHelper.php @@ -14,6 +14,8 @@ namespace TYPO3\CMS\Extensionmanager\ViewHelpers; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; use TYPO3\CMS\Extensionmanager\Domain\Model\Extension; @@ -28,11 +30,6 @@ class DownloadExtensionViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\Abst */ protected $tagName = 'form'; - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - /** * @var \TYPO3\CMS\Extbase\Service\ExtensionService */ @@ -46,14 +43,6 @@ class DownloadExtensionViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\Abst $this->extensionService = $extensionService; } - /** - * @param \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility - */ - public function injectConfigurationUtility(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility) - { - $this->configurationUtility = $configurationUtility; - } - /** * Initialize arguments. */ @@ -99,7 +88,7 @@ class DownloadExtensionViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\Abst ], 'Download'); $this->tag->addAttribute('data-href', $uri); - $automaticInstallation = $this->configurationUtility->getCurrentConfiguration('extensionmanager')['automaticInstallation']['value']; + $automaticInstallation = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'automaticInstallation'); $labelKeySuffix = $automaticInstallation ? '' : '.downloadOnly'; $label = ' <div class="btn-group"> diff --git a/typo3/sysext/extensionmanager/Resources/Private/Language/locallang.xlf b/typo3/sysext/extensionmanager/Resources/Private/Language/locallang.xlf index 3abe4d56aad26a7972c36324281308e03473f468..bd9433b58f64cf8233be4d1ff9981eec143928ab 100644 --- a/typo3/sysext/extensionmanager/Resources/Private/Language/locallang.xlf +++ b/typo3/sysext/extensionmanager/Resources/Private/Language/locallang.xlf @@ -27,45 +27,6 @@ <trans-unit id="showAllVersions"> <source>Show all versions of</source> </trans-unit> - <trans-unit id="extConfTemplate.headline"> - <source>Configure Extension</source> - </trans-unit> - <trans-unit id="extConfTemplate.other"> - <source>Other</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.int+"> - <source>positive integer</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.int"> - <source>integer</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.integer"> - <source>integer</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.color"> - <source>color</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.wrap"> - <source>wrap</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.offset"> - <source>offset</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.options"> - <source>options</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.boolean"> - <source>boolean</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.user"> - <source>user</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.small"> - <source>small</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.string"> - <source>string</source> - </trans-unit> <trans-unit id="extConfTemplate.backToList"> <source>Back to list</source> </trans-unit> @@ -96,12 +57,6 @@ <trans-unit id="button.resolveDependenciesIgnore"> <source>I know what I'm doing, continue anyway</source> </trans-unit> - <trans-unit id="extensionList.clickToConfigure"> - <source>(Click to configure)</source> - </trans-unit> - <trans-unit id="extensionList.configure"> - <source>Configure</source> - </trans-unit> <trans-unit id="extensionList.update.script"> <source>Execute the update script</source> </trans-unit> diff --git a/typo3/sysext/extensionmanager/Resources/Private/Templates/Configuration/ShowConfigurationForm.html b/typo3/sysext/extensionmanager/Resources/Private/Templates/Configuration/ShowConfigurationForm.html deleted file mode 100644 index cfcfe6f5b8846ac57112f21356c49c7ad047503c..0000000000000000000000000000000000000000 --- a/typo3/sysext/extensionmanager/Resources/Private/Templates/Configuration/ShowConfigurationForm.html +++ /dev/null @@ -1,80 +0,0 @@ -{namespace em=TYPO3\CMS\Extensionmanager\ViewHelpers} - -<f:layout name="main" /> - -<f:section name="headline"> - <h1> - <f:translate key="extConfTemplate.headline" /> - {extension.key} - </h1> -</f:section> - -<f:section name="content"> - <div role="tabpanel"> - <ul class="nav nav-tabs" role="tablist"> - <f:for each="{configuration}" as="category" key="categoryNumber" iteration="iteration"> - <f:if condition="{category.name}"> - <li role="presentation" class="{f:if(condition:'{iteration.isFirst}', then:'active')}"> - <a class="text-capitalize" href="#category-{categoryNumber}" aria-controls="category-{categoryNumber}" role="tab" data-toggle="tab"> - {category.name} - </a> - </li> - </f:if> - </f:for> - </ul> - - <f:form action="save" name="configurationform" id="configurationform"> - <div class="tab-content"> - <f:form.hidden name="extensionKey" value="{extension.key}" /> - <f:for each="{configuration}" as="category" key="categoryNumber" iteration="iteration"> - <f:if condition="{category.name}"> - <div role="tabpanel" class="tab-pane {f:if(condition:'{iteration.isFirst}', then:'active')}" id="category-{categoryNumber}"> - <f:for each="{category.subcategories}" as="subcategory"> - <div class="form-section"> - <f:if condition="{subcategory.label}"> - <f:then> - <h2 class="h4 form-section-headline">{subcategory.label}</h2> - </f:then> - <f:else> - <f:if condition="{category.subcategories->f:count()} > 1"> - <h3 class="h4 form-section-headline"><f:translate key="extConfTemplate.other" /></h3> - </f:if> - </f:else> - </f:if> - <f:for each="{subcategory.items}" as="item"> - <div class="form-group form-group-dashed"> - <label for="em-{item.name}"> - {item.labelHeadline}<br> - <span class="text-monospace text-normal"> - {category.name}.{item.name} - <f:if condition="{item.type} != 'user'"> - <f:alias map="{label: '{f:translate(key: \'extConfTemplate.type.{item.type}\')}'}"> - <f:if condition="{label}"> - ({label}) - </f:if> - </f:alias> - </f:if> - </span> - </label> - <div class="form-control-wrap"> - <em:form.typoScriptConstants configuration="{item}" /> - </div> - <f:if condition="{item.labelText}"> - <div class="help-block">{item.labelText -> f:format.nl2br()}</div> - </f:if> - </div> - </f:for> - </div> - </f:for> - </div> - </f:if> - </f:for> - </div> - <f:comment> - In order to allow form submit on pressing enter, a submit button is needed. See #66846 - The submit button is hidden as long as the save buttons are not part of the form yet. - </f:comment> - <f:form.submit name="mySubmit" value="Go" class="hidden" /> - </f:form> - </div> -</f:section> diff --git a/typo3/sysext/extensionmanager/Resources/Private/Templates/Distribution/Show.html b/typo3/sysext/extensionmanager/Resources/Private/Templates/Distribution/Show.html index 803a34dfb0146424a8d2b48816a5360966099df9..f0e5a87c2c0636a55a0407bdd031b6f143b3e49a 100644 --- a/typo3/sysext/extensionmanager/Resources/Private/Templates/Distribution/Show.html +++ b/typo3/sysext/extensionmanager/Resources/Private/Templates/Distribution/Show.html @@ -25,20 +25,13 @@ </li> </f:else> <f:then> - <f:if condition="{configurationLink}"> - <li> - <a href="{configurationLink}" class="btn btn-default"> - <core:icon identifier="actions-system-extension-configure" /> <f:translate key="extensionList.configure" /> - </a> - </li> - </f:if> <li> <button class="btn btn-default distribution-openViewModule" onclick="top.goToModule('web_ViewpageView');"> <core:icon identifier="actions-document-view" /> <f:translate key="distribution.welcome.openViewModule" /> </button> </li> <li> - <button class="btn btn-default distribution-openPageModule" onclick="top.goToModule('web_page');"> + <button class="btn btn-default distribution-openPageModule" onclick="top.goToModule('web_layout');"> <core:icon identifier="actions-open" /> <f:translate key="distribution.welcome.openPageModule" /> </button> </li> diff --git a/typo3/sysext/extensionmanager/Resources/Private/Templates/List/Index.html b/typo3/sysext/extensionmanager/Resources/Private/Templates/List/Index.html index 68c60d37dbfc184eea527cffbc8fb406c7b298f9..088caf489b8729b23a1815b81a85c6013616201f 100644 --- a/typo3/sysext/extensionmanager/Resources/Private/Templates/List/Index.html +++ b/typo3/sysext/extensionmanager/Resources/Private/Templates/List/Index.html @@ -67,7 +67,7 @@ <f:if condition="{extension.ext_icon}"> <img class="ext-icon" src="../{extension.siteRelPath}{extension.ext_icon}" alt="{extension.title}" /> </f:if> - <em:configureExtension extension="{extension}" forceConfiguration="0" showDescription="1">{extension.title}</em:configureExtension> + <span title="{extension.description}">{extension.title}</span> </td> <td> {extensionKey} @@ -84,9 +84,6 @@ <td> <div class="btn-group"> <em:processAvailableActions extension="{extension}"> - <em:configureExtension class="btn btn-default" extension="{extension}" title="{f:translate(key:'extensionList.configure')}"> - <core:icon identifier="actions-system-extension-configure" /> - </em:configureExtension> <em:updateScript class="btn btn-default" extensionKey="{extension.key}" /> <em:removeExtension class="btn btn-default" extension="{extension}" /> <f:link.action action="downloadExtensionZip" controller="Action" arguments="{extension:extension.key}" title="{f:translate(key:'extensionList.downloadzip')}" class="btn btn-default"> diff --git a/typo3/sysext/extensionmanager/Resources/Public/JavaScript/Main.js b/typo3/sysext/extensionmanager/Resources/Public/JavaScript/Main.js index e455b9c14c6edf436dd70ca1ad2f5314d492346d..ade1fd321efd481192ab6ae6d419d5071c4cf80f 100644 --- a/typo3/sysext/extensionmanager/Resources/Public/JavaScript/Main.js +++ b/typo3/sysext/extensionmanager/Resources/Public/JavaScript/Main.js @@ -295,79 +295,6 @@ define([ ); }; - /** - * configuration properties - */ - ExtensionManager.configurationFieldSupport = function() { - $('.t3js-emconf-offset').each(function() { - var $me = $(this), - $parent = $me.parent(), - id = $me.attr('id'), - val = $me.attr('value'), - valArr = val.split(','); - - $me.attr('data-offsetfield-x', '#' + id + '_offset_x') - .attr('data-offsetfield-y', '#' + id + '_offset_y') - .wrap('<div class="hidden"></div>'); - - var elementX = '' + - '<div class="form-multigroup-item">' + - '<div class="input-group">' + - '<div class="input-group-addon">x</div>' + - '<input id="' + id + '_offset_x" class="form-control t3js-emconf-offsetfield" data-target="#' + id + '" value="' + $.trim(valArr[0]) + '">' + - '</div>' + - '</div>'; - var elementY = '' + - '<div class="form-multigroup-item">' + - '<div class="input-group">' + - '<div class="input-group-addon">y</div>' + - '<input id="' + id + '_offset_y" class="form-control t3js-emconf-offsetfield" data-target="#' + id + '" value="' + $.trim(valArr[1]) + '">' + - '</div>' + - '</div>'; - - var offsetGroup = '<div class="form-multigroup-wrap">' + elementX + elementY + '</div>'; - $parent.append(offsetGroup); - $parent.find('.t3js-emconf-offset').keyup(function() { - var $target = $($(this).data('target')); - $target.attr( - 'value', - $($target.data('offsetfield-x')).val() + ',' + $($target.data('offsetfield-y')).val() - ); - }); - }); - - $('.t3js-emconf-wrap').each(function() { - var $me = $(this), - $parent = $me.parent(), - id = $me.attr('id'), - val = $me.attr('value'), - valArr = val.split('|'); - - $me.attr('data-wrapfield-start', '#' + id + '_wrap_start') - .attr('data-wrapfield-end', '#' + id + '_wrap_end') - .wrap('<div class="hidden"></div>'); - - var elementStart = '' + - '<div class="form-multigroup-item">' + - '<input id="' + id + '_wrap_start" class="form-control t3js-emconf-wrapfield" data-target="#' + id + '" value="' + $.trim(valArr[0]) + '">' + - '</div>'; - var elementEnd = '' + - '<div class="form-multigroup-item">' + - '<input id="' + id + '_wrap_end" class="form-control t3js-emconf-wrapfield" data-target="#' + id + '" value="' + $.trim(valArr[1]) + '">' + - '</div>'; - - var wrapGroup = '<div class="form-multigroup-wrap">' + elementStart + elementEnd + '</div>'; - $parent.append(wrapGroup); - $parent.find('.t3js-emconf-wrapfield').keyup(function() { - var $target = $($(this).data('target')); - $target.attr( - 'value', - $($target.data('wrapfield-start')).val() + '|' + $($target.data('wrapfield-end')).val() - ); - }); - }); - }; - /** * * @type {{downloadPath: string}} @@ -773,8 +700,6 @@ define([ NProgress.start(); }); - ExtensionManager.configurationFieldSupport(); - SplitButtons.addPreSubmitCallback(function(e) { if ($(e.target).hasClass('t3js-save-close')) { $('#configurationform').append($('<input />', {type: 'hidden', name: 'tx_extensionmanager_tools_extensionmanagerextensionmanager[action]', value: 'saveAndClose'})); diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Repository/ConfigurationItemRepositoryTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Domain/Repository/ConfigurationItemRepositoryTest.php deleted file mode 100644 index e22dada937caa9fc6b02f154ba80b7ac3d853771..0000000000000000000000000000000000000000 --- a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Repository/ConfigurationItemRepositoryTest.php +++ /dev/null @@ -1,291 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Domain\Repository; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Extbase\Object\ObjectManager; - -/** - * Tests for ConfigurationItemRepository - */ -class ConfigurationItemRepositoryTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase -{ - /** - * @var \TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository|\TYPO3\TestingFramework\Core\AccessibleObjectInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $configurationItemRepository; - - /** - * @var \TYPO3\CMS\Extbase\Object\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $injectedObjectManagerMock; - - /** - * Set up - */ - protected function setUp() - { - // Mock system under test to make protected methods accessible - $this->configurationItemRepository = $this->getAccessibleMock( - \TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository::class, - ['dummy'] - ); - - $this->injectedObjectManagerMock = $this->createMock(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface::class); - $this->configurationItemRepository->_set( - 'objectManager', - $this->injectedObjectManagerMock - ); - } - - /** - * @test - */ - public function getConfigurationArrayFromExtensionKeyReturnsSortedHierarchicArray() - { - $flatConfigurationItemArray = [ - 'item1' => [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/10z', - 'type' => 'string', - 'label' => 'Item 1: This is the first configuration item', - 'name' =>'item1', - 'value' => 'one', - 'default_value' => 'one', - 'subcat_label' => 'Enable features', - ], - 'integerValue' => [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/20z', - 'type' => 'int+', - 'label' => 'Integer Value: Please insert a positive integer value', - 'name' =>'integerValue', - 'value' => '1', - 'default_value' => '1', - 'subcat_label' => 'Enable features', - ], - 'enableJquery' => [ - 'cat' => 'advanced', - 'subcat_name' => 'file', - 'subcat' => 'c/file/10z', - 'type' => 'boolean', - 'label' => 'enableJquery: Insert jQuery plugin', - 'name' =>'enableJquery', - 'value' => '1', - 'default_value' => '1', - 'subcat_label' => 'Files', - ], - ]; - - $configurationItemRepository = $this->getAccessibleMock( - \TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository::class, - ['translate'] - ); - $configurationItemRepository->_set( - 'objectManager', - $this->injectedObjectManagerMock - ); - $configurationUtilityMock = $this->createMock(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class); - $configurationUtilityMock - ->expects($this->once()) - ->method('getCurrentConfiguration') - ->will($this->returnValue($flatConfigurationItemArray)); - - $this->injectedObjectManagerMock - ->expects($this->any()) - ->method('get') - ->will($this->returnValue($configurationUtilityMock)); - - $expectedArray = [ - 'basic' => [ - 'enable' => [ - 'item1' => [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/10z', - 'type' => 'string', - 'label' => 'Item 1: This is the first configuration item', - 'name' =>'item1', - 'value' => 'one', - 'default_value' => 'one', - 'subcat_label' => 'Enable features', - 'labels' => [ - 0 => 'Item 1', - 1 => 'This is the first configuration item' - ] - ], - 'integerValue' => [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/20z', - 'type' => 'int+', - 'label' => 'Integer Value: Please insert a positive integer value', - 'name' =>'integerValue', - 'value' => '1', - 'default_value' => '1', - 'subcat_label' => 'Enable features', - 'labels' => [ - 0 => 'Integer Value', - 1 => 'Please insert a positive integer value' - ] - ] - ] - ], - 'advanced' => [ - 'file' => [ - 'enableJquery' => [ - 'cat' => 'advanced', - 'subcat_name' => 'file', - 'subcat' => 'c/file/10z', - 'type' => 'boolean', - 'label' => 'enableJquery: Insert jQuery plugin', - 'name' =>'enableJquery', - 'value' => '1', - 'default_value' => '1', - 'subcat_label' => 'Files', - 'labels' => [ - 0 => 'enableJquery', - 1 => 'Insert jQuery plugin' - ] - ], - ] - ] - ]; - - $this->assertSame( - $expectedArray, - $configurationItemRepository->_call('getConfigurationArrayFromExtensionKey', $this->getUniqueId('some_extension')) - ); - } - - /** - * @return array - */ - public function extractInformationForConfigFieldsOfTypeUserAddsGenericAndTypeInformationDataProvider() - { - return [ - [ - [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/z', - 'type' => 'user[TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->checkConfigurationFrontend]', - 'label' => 'Frontend configuration check', - 'name' => 'checkConfigurationFE', - 'value' => 0, - 'default_value' => 0, - 'comparisonGeneric' => 'TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->checkConfigurationFrontend' - ] - ], - [ - [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/z', - 'type' => 'user[TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->checkConfigurationBackend]', - 'label' => 'Backend configuration check', - 'name' => 'checkConfigurationBE', - 'value' => 0, - 'default_value' => 0, - 'comparisonGeneric' => 'TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->checkConfigurationBackend' - ] - ], - [ - [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/z', - 'type' => 'user[TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->buildHashMethodSelectorFE]', - 'label' => 'Hashing method for the frontend: Defines salted hashing method to use. Choose "Portable PHP password hashing" to stay compatible with other CMS (e.g. Drupal, Wordpress). Choose "MD5 salted hashing" to reuse TYPO3 passwords for OS level authentication (other servers could use TYPO3 passwords). Choose "Blowfish salted hashing" for advanced security to reuse passwords on OS level (Blowfish might not be supported on your system TODO).', - 'name' => 'FE.saltedPWHashingMethod', - 'value' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, - 'default_value' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, - 'comparisonGeneric' => 'TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->buildHashMethodSelectorFE' - ] - ] - ]; - } - - /** - * @test - * @dataProvider extractInformationForConfigFieldsOfTypeUserAddsGenericAndTypeInformationDataProvider - * @param $configurationOption - */ - public function extractInformationForConfigFieldsOfTypeUserAddsGenericAndTypeInformation($configurationOption) - { - $configurationOptionModified = $this->configurationItemRepository->_callRef('extractInformationForConfigFieldsOfTypeUser', $configurationOption); - $this->assertEquals('user', $configurationOptionModified['type']); - $this->assertEquals($configurationOption['comparisonGeneric'], $configurationOptionModified['generic']); - } - - /** - * @test - */ - public function extractInformationForConfigFieldsOfTypeOptionsAddsGenericTypeAndLabelInformation() - { - $option = [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/100z', - 'type' => 'options[Minimal (Most features disabled. Administrator needs to enable them using TypoScript. For advanced administrators only.),Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.),Demo (Show-off configuration. Includes pre-configured styles. Not for production environments.)]', - 'label' => 'Default configuration settings', - 'name' => 'defaultConfiguration', - 'value' => 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)', - 'default_value' => 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)', - 'genericComparisonValue' => [ - 'Minimal (Most features disabled. Administrator needs to enable them using TypoScript. For advanced administrators only.)' => 'Minimal (Most features disabled. Administrator needs to enable them using TypoScript. For advanced administrators only.)', - 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)' => 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)', - 'Demo (Show-off configuration. Includes pre-configured styles. Not for production environments.)' => 'Demo (Show-off configuration. Includes pre-configured styles. Not for production environments.)' - ], - 'typeComparisonValue' => 'options' - ]; - $optionModified = $this->configurationItemRepository->_callRef('extractInformationForConfigFieldsOfTypeOptions', $option); - $this->assertArrayHasKey('generic', $optionModified); - $this->assertArrayHasKey('type', $optionModified); - $this->assertArrayHasKey('label', $optionModified); - $this->assertEquals($option['genericComparisonValue'], $optionModified['generic']); - $this->assertEquals($option['typeComparisonValue'], $optionModified['type']); - } - - /** - * @test - */ - public function extractInformationForConfigFieldsOfTypeOptionsWithLabelsAndValuesAddsGenericTypeAndLabelInformation() - { - $option = [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/100z', - 'type' => 'options[Minimal (Most features disabled. Administrator needs to enable them using TypoScript. For advanced administrators only.)=MINIMAL,Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.) = TYPICAL,Demo (Show-off configuration. Includes pre-configured styles. Not for production environments.)=DEMO]', - 'label' => 'Default configuration settings', - 'name' => 'defaultConfiguration', - 'value' => 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)', - 'default_value' => 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)', - 'genericComparisonValue' => [ - 'Minimal (Most features disabled. Administrator needs to enable them using TypoScript. For advanced administrators only.)' => 'MINIMAL', - 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)' => 'TYPICAL', - 'Demo (Show-off configuration. Includes pre-configured styles. Not for production environments.)' => 'DEMO' - ], - 'typeComparisonValue' => 'options' - ]; - $optionModified = $this->configurationItemRepository->_callRef('extractInformationForConfigFieldsOfTypeOptions', $option); - $this->assertArrayHasKey('generic', $optionModified); - $this->assertArrayHasKey('type', $optionModified); - $this->assertArrayHasKey('label', $optionModified); - $this->assertEquals($option['genericComparisonValue'], $optionModified['generic']); - $this->assertEquals($option['typeComparisonValue'], $optionModified['type']); - } -} diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Utility/ConfigurationUtilityTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Utility/ConfigurationUtilityTest.php deleted file mode 100644 index c838ed6544dfec0b7d6aad4da2f84b5dfd943249..0000000000000000000000000000000000000000 --- a/typo3/sysext/extensionmanager/Tests/Unit/Utility/ConfigurationUtilityTest.php +++ /dev/null @@ -1,325 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Utility; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility; - -/** - * Configuration utility test - */ -class ConfigurationUtilityTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase -{ - /** - * @test - */ - public function getCurrentConfigurationReturnsExtensionConfigurationAsValuedConfiguration() - { - /** @var $configurationUtility ConfigurationUtility|\TYPO3\TestingFramework\Core\AccessibleObjectInterface|\PHPUnit_Framework_MockObject_MockObject */ - $configurationUtility = $this->getMockBuilder(ConfigurationUtility::class) - ->setMethods(['getDefaultConfigurationFromExtConfTemplateAsValuedArray']) - ->getMock(); - $configurationUtility - ->expects($this->once()) - ->method('getDefaultConfigurationFromExtConfTemplateAsValuedArray') - ->will($this->returnValue([])); - $extensionKey = $this->getUniqueId('some-extension'); - - $currentConfiguration = [ - 'key1' => 'value1', - 'key2.' => [ - 'subkey1' => 'value2' - ] - ]; - - $expected = [ - 'key1' => [ - 'value' => 'value1', - ], - 'key2.subkey1' => [ - 'value' => 'value2', - ], - ]; - - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][$extensionKey] = serialize($currentConfiguration); - $actual = $configurationUtility->getCurrentConfiguration($extensionKey); - $this->assertEquals($expected, $actual); - } - - /** - * @test - */ - public function getCurrentConfigurationReturnsExtensionConfigurationWithExtconfBasedConfigurationPrioritized() - { - /** @var $configurationUtility \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility|\TYPO3\TestingFramework\Core\AccessibleObjectInterface|\PHPUnit_Framework_MockObject_MockObject */ - $configurationUtility = $this->getMockBuilder(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class) - ->setMethods(['getDefaultConfigurationFromExtConfTemplateAsValuedArray']) - ->getMock(); - $configurationUtility - ->expects($this->once()) - ->method('getDefaultConfigurationFromExtConfTemplateAsValuedArray') - ->will($this->returnValue([])); - $extensionKey = $this->getUniqueId('some-extension'); - - $serializedConfiguration = [ - 'key1' => 'value1', - 'key2.' => [ - 'subkey1' => 'somevalue' - ] - ]; - $currentExtconfConfiguration = [ - 'key1' => 'value1', - 'key2.' => [ - 'subkey1' => 'overwritten' - ] - ]; - - $expected = [ - 'key1' => [ - 'value' => 'value1', - ], - 'key2.subkey1' => [ - 'value' => 'overwritten', - ], - ]; - - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][$extensionKey] = serialize($serializedConfiguration); - $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extensionKey] = $currentExtconfConfiguration; - $actual = $configurationUtility->getCurrentConfiguration($extensionKey); - $this->assertEquals($expected, $actual); - } - - /** - * @test - */ - public function mergeDefaultConfigurationReturnsEmptyArrayIfNoConfigurationForExtensionExists() - { - $configurationUtility = new ConfigurationUtility(); - $result = $configurationUtility->getCurrentConfiguration('not_existing_extension'); - self::assertSame([], $result); - } - - /** - * @test - */ - public function getDefaultConfigurationFromExtConfTemplateAsValuedArrayReturnsExpectedExampleArray() - { - /** @var $configurationUtility \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility|\TYPO3\TestingFramework\Core\AccessibleObjectInterface|\PHPUnit_Framework_MockObject_MockObject */ - $configurationUtility = $this->getAccessibleMock( - \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class, - ['getDefaultConfigurationRawString'] - ); - $configurationUtility - ->expects($this->once()) - ->method('getDefaultConfigurationRawString') - ->will($this->returnValue(file_get_contents(__DIR__ . '/Fixtures/ext_conf_template.txt'))); - - $objectManagerMock = $this->getMockBuilder(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface::class)->getMock(); - $configurationUtility->_set('objectManager', $objectManagerMock); - - $expected = [ - 'checkConfigurationFE' => [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/1z', - 'type' => 'user[TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->checkConfigurationFrontend]', - 'label' => 'Frontend configuration check', - 'name' => 'checkConfigurationFE', - 'value' => '0', - 'default_value' => '0', - 'subcat_label' => 'Enable features', - ], - 'BE.forceSalted' => [ - 'cat' => 'backend', - 'subcat' => 'x/2z', - 'type' => 'boolean', - 'label' => 'Force salted passwords: Enforce usage of SaltedPasswords. Old MD5 hashed passwords will stop working.', - 'name' => 'BE.forceSalted', - 'value' => '0', - 'default_value' => '0', - ], - ]; - - $result = $configurationUtility->getDefaultConfigurationFromExtConfTemplateAsValuedArray($this->getUniqueId('some_extension')); - $this->assertEquals($expected, $result); - } - - /** - * Data provider for convertValuedToNestedConfiguration - * - * @return array - */ - public function convertValuedToNestedConfigurationDataProvider() - { - return [ - 'plain array' => [ - [ - 'first' => [ - 'value' => 'value1' - ], - 'second' => [ - 'value' => 'value2' - ] - ], - [ - 'first' => 'value1', - 'second' => 'value2' - ] - ], - 'nested value with 2 levels' => [ - [ - 'first.firstSub' => [ - 'value' => 'value1' - ], - 'second.secondSub' => [ - 'value' => 'value2' - ] - ], - [ - 'first.' => [ - 'firstSub' => 'value1' - ], - 'second.' => [ - 'secondSub' => 'value2' - ] - ] - ], - 'nested value with 3 levels' => [ - [ - 'first.firstSub.firstSubSub' => [ - 'value' => 'value1' - ], - 'second.secondSub.secondSubSub' => [ - 'value' => 'value2' - ] - ], - [ - 'first.' => [ - 'firstSub.' => [ - 'firstSubSub' => 'value1' - ] - ], - 'second.' => [ - 'secondSub.' => [ - 'secondSubSub' => 'value2' - ] - ] - ] - ], - 'mixed nested value with 2 levels' => [ - [ - 'first' => [ - 'value' => 'firstValue' - ], - 'first.firstSub' => [ - 'value' => 'value1' - ], - 'second.secondSub' => [ - 'value' => 'value2' - ] - ], - [ - 'first' => 'firstValue', - 'first.' => [ - 'firstSub' => 'value1' - ], - 'second.' => [ - 'secondSub' => 'value2' - ] - ] - ] - ]; - } - - /** - * @test - * @dataProvider convertValuedToNestedConfigurationDataProvider - * - * @param array $configuration - * @param array $expected - */ - public function convertValuedToNestedConfiguration(array $configuration, array $expected) - { - /** @var $subject \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\TestingFramework\Core\AccessibleObjectInterface */ - $subject = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class, ['dummy'], [], '', false); - $this->assertEquals($expected, $subject->convertValuedToNestedConfiguration($configuration)); - } - - /** - * Data provider for convertNestedToValuedConfiguration - * - * @return array - */ - public function convertNestedToValuedConfigurationDataProvider() - { - return [ - 'plain array' => [ - [ - 'first' => 'value1', - 'second' => 'value2' - ], - [ - 'first' => ['value' => 'value1'], - 'second' => ['value' => 'value2'], - ] - ], - 'two levels' => [ - [ - 'first.' => ['firstSub' => 'value1'], - 'second.' => ['firstSub' => 'value2'], - ], - [ - 'first.firstSub' => ['value' => 'value1'], - 'second.firstSub' => ['value' => 'value2'], - ] - ], - 'three levels' => [ - [ - 'first.' => ['firstSub.' => ['firstSubSub' => 'value1']], - 'second.' => ['firstSub.' => ['firstSubSub' => 'value2']] - ], - [ - 'first.firstSub.firstSubSub' => ['value' => 'value1'], - 'second.firstSub.firstSubSub' => ['value' => 'value2'], - ] - ], - 'mixed' => [ - [ - 'first.' => ['firstSub' => 'value1'], - 'second.' => ['firstSub.' => ['firstSubSub' => 'value2']], - 'third' => 'value3' - ], - [ - 'first.firstSub' => ['value' => 'value1'], - 'second.firstSub.firstSubSub' => ['value' => 'value2'], - 'third' => ['value' => 'value3'] - ] - ] - ]; - } - - /** - * @test - * @dataProvider convertNestedToValuedConfigurationDataProvider - * - * @param array $configuration - * @param array $expected - */ - public function convertNestedToValuedConfiguration(array $configuration, array $expected) - { - /** @var $subject \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\TestingFramework\Core\AccessibleObjectInterface */ - $subject = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class, ['dummy'], [], '', false); - $this->assertEquals($expected, $subject->convertNestedToValuedConfiguration($configuration)); - } -} diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Utility/Fixtures/ext_conf_template.txt b/typo3/sysext/extensionmanager/Tests/Unit/Utility/Fixtures/ext_conf_template.txt deleted file mode 100644 index 1d8ab7160d789aab155726398d97cfc1008551ea..0000000000000000000000000000000000000000 --- a/typo3/sysext/extensionmanager/Tests/Unit/Utility/Fixtures/ext_conf_template.txt +++ /dev/null @@ -1,5 +0,0 @@ -# cat=Basic/enable; type=user[TYPO3\CMS\Saltedpasswords\Utility\ExtensionManagerConfigurationUtility->checkConfigurationFrontend]; label=Frontend configuration check -checkConfigurationFE=0 - -# cat=Backend; type=boolean; label=Force salted passwords: Enforce usage of SaltedPasswords. Old MD5 hashed passwords will stop working. -BE.forceSalted = 0 diff --git a/typo3/sysext/extensionmanager/ext_localconf.php b/typo3/sysext/extensionmanager/ext_localconf.php index e7242e2151c4a6f6845d2e304ac8d287559f3b15..6fff4aab1cf7a511b86113b7aa39c81faa53d0d3 100644 --- a/typo3/sysext/extensionmanager/ext_localconf.php +++ b/typo3/sysext/extensionmanager/ext_localconf.php @@ -2,8 +2,10 @@ defined('TYPO3_MODE') or die(); // Register extension list update task -$extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['extensionmanager'], ['allowed_classes' => false]); -if (empty($extConf['offlineMode'])) { +$offlineMode = (bool)\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( + \TYPO3\CMS\Core\Configuration\ExtensionConfiguration::class +)->get('extensionmanager', 'offlineMode'); +if (!$offlineMode) { $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\TYPO3\CMS\Extensionmanager\Task\UpdateExtensionListTask::class] = [ 'extension' => 'extensionmanager', 'title' => 'LLL:EXT:extensionmanager/Resources/Private/Language/locallang.xlf:task.updateExtensionListTask.name', @@ -11,6 +13,7 @@ if (empty($extConf['offlineMode'])) { 'additionalFields' => '', ]; } +unset($offlineMode); $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = \TYPO3\CMS\Extensionmanager\Command\ExtensionCommandController::class; @@ -37,8 +40,6 @@ if (TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_BE) { unset($signalSlotDispatcher); } -unset($extConf); - // Register extension status report system $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['reports']['tx_reports']['status']['providers']['Extension Manager'][] = \TYPO3\CMS\Extensionmanager\Report\ExtensionStatus::class; diff --git a/typo3/sysext/indexed_search/Classes/Controller/AdministrationController.php b/typo3/sysext/indexed_search/Classes/Controller/AdministrationController.php index a9bc64978fb1eddd78489bc6134d7172a5fbc0e8..9cbab0a8c2a4d21277f5b1d35d54addfc5f4b8e7 100644 --- a/typo3/sysext/indexed_search/Classes/Controller/AdministrationController.php +++ b/typo3/sysext/indexed_search/Classes/Controller/AdministrationController.php @@ -16,6 +16,7 @@ namespace TYPO3\CMS\IndexedSearch\Controller; use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Backend\View\BackendTemplateView; use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Localization\LanguageService; @@ -150,7 +151,7 @@ class AdministrationController extends ActionController public function initializeAction() { $this->pageUid = (int)GeneralUtility::_GET('id'); - $this->indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $this->indexerConfig = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search'); $this->enableMetaphoneSearch = (bool)$this->indexerConfig['enableMetaphoneSearch']; $this->indexer = GeneralUtility::makeInstance(Indexer::class); diff --git a/typo3/sysext/indexed_search/Classes/Controller/SearchController.php b/typo3/sysext/indexed_search/Classes/Controller/SearchController.php index fbe71c38e7d28d243c6ff73f3bbf0bdd30f91976..167980cacb09a5bc6fceed71a22efacf5f2e4d99 100644 --- a/typo3/sysext/indexed_search/Classes/Controller/SearchController.php +++ b/typo3/sysext/indexed_search/Classes/Controller/SearchController.php @@ -15,6 +15,7 @@ namespace TYPO3\CMS\IndexedSearch\Controller; */ use TYPO3\CMS\Core\Charset\CharsetConverter; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Restriction\FrontendRestrictionContainer; @@ -134,7 +135,7 @@ class SearchController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionControlle protected $iconFileNameCache = []; /** - * Indexer configuration, coming from $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'] + * Indexer configuration, coming from TYPO3's system configuration for EXT:indexed_search * * @var array */ @@ -198,7 +199,7 @@ class SearchController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionControlle $searchData = array_merge($this->settings['defaultOptions'], $searchData); } // Indexer configuration from Extension Manager interface: - $this->indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $this->indexerConfig = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search'); $this->enableMetaphoneSearch = (bool)$this->indexerConfig['enableMetaphoneSearch']; $this->initializeExternalParsers(); // If "_sections" is set, this value overrides any existing value. diff --git a/typo3/sysext/indexed_search/Classes/Domain/Repository/IndexSearchRepository.php b/typo3/sysext/indexed_search/Classes/Domain/Repository/IndexSearchRepository.php index bec21d01e819af8c708c8e5ed0dd1936c0c4b8bd..e3ffce7df85ad77a46d087860db399b0a06afddf 100644 --- a/typo3/sysext/indexed_search/Classes/Domain/Repository/IndexSearchRepository.php +++ b/typo3/sysext/indexed_search/Classes/Domain/Repository/IndexSearchRepository.php @@ -15,6 +15,7 @@ namespace TYPO3\CMS\IndexedSearch\Domain\Repository; */ use Doctrine\DBAL\Driver\Statement; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\QueryHelper; @@ -208,20 +209,12 @@ class IndexSearchRepository */ public function doSearch($searchWords, $freeIndexUid = -1) { - // unserializing the configuration so we can use it here: - $extConf = []; - if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'])) { - $extConf = unserialize( - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], - ['allowed_classes' => false] - ); - } - + $useMysqlFulltext = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search', 'useMysqlFulltext'); // Getting SQL result pointer: $this->getTimeTracker()->push('Searching result'); if ($hookObj = &$this->hookRequest('getResultRows_SQLpointer')) { $result = $hookObj->getResultRows_SQLpointer($searchWords, $freeIndexUid); - } elseif (isset($extConf['useMysqlFulltext']) && $extConf['useMysqlFulltext'] === '1') { + } elseif ($useMysqlFulltext) { $result = $this->getResultRows_SQLpointerMysqlFulltext($searchWords, $freeIndexUid); } else { $result = $this->getResultRows_SQLpointer($searchWords, $freeIndexUid); diff --git a/typo3/sysext/indexed_search/Classes/FileContentParser.php b/typo3/sysext/indexed_search/Classes/FileContentParser.php index d31e2a83ab293613271be2648595270110879669..31c75e953cab83424bfde06c58410ada22576a20 100644 --- a/typo3/sysext/indexed_search/Classes/FileContentParser.php +++ b/typo3/sysext/indexed_search/Classes/FileContentParser.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\IndexedSearch; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Utility\CommandUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; @@ -76,7 +77,7 @@ class FileContentParser public function initParser($extension) { // Then read indexer-config and set if appropriate: - $indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $indexerConfig = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search'); // If windows, apply extension to tool name: $exe = TYPO3_OS === 'WIN' ? '.exe' : ''; // lg @@ -288,7 +289,7 @@ class FileContentParser public function searchTypeMediaTitle($extension) { // Read indexer-config - $indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $indexerConfig = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search'); // Ignore extensions $ignoreExtensions = GeneralUtility::trimExplode(',', strtolower($indexerConfig['ignoreExtensions']), true); if (in_array($extension, $ignoreExtensions)) { diff --git a/typo3/sysext/indexed_search/Classes/Indexer.php b/typo3/sysext/indexed_search/Classes/Indexer.php index 57c0dbc75183b1bea705d364bde1820ed9c72c73..f4afc54d62c8d4cfdc8e4b8594379f91d32af30b 100644 --- a/typo3/sysext/indexed_search/Classes/Indexer.php +++ b/typo3/sysext/indexed_search/Classes/Indexer.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\IndexedSearch; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\TimeTracker\TimeTracker; @@ -133,7 +134,7 @@ class Indexer public $indexerConfig = []; /** - * Indexer configuration, coming from $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'] + * Indexer configuration, coming from TYPO3's system configuration for EXT:indexed_search * * @var array */ @@ -251,7 +252,7 @@ class Indexer public function hook_indexContent(&$pObj) { // Indexer configuration from Extension Manager interface: - $indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $disableFrontendIndexing = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search', 'disableFrontendIndexing'); // Crawler activation: // Requirements are that the crawler is loaded, a crawler session is running and re-indexing requested as processing instruction: if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('crawler') && $pObj->applicationData['tx_crawler']['running'] && in_array('tx_indexedsearch_reindex', $pObj->applicationData['tx_crawler']['parameters']['procInstructions'])) { @@ -265,7 +266,7 @@ class Indexer // Determine if page should be indexed, and if so, configure and initialize indexer if ($pObj->config['config']['index_enable']) { $this->log_push('Index page', ''); - if (!$indexerConfig['disableFrontendIndexing'] || $this->crawlerActive) { + if (!$disableFrontendIndexing || $this->crawlerActive) { if (!$pObj->page['no_search']) { if (!$pObj->no_cache) { if ((int)$pObj->sys_language_uid === (int)$pObj->sys_language_content) { @@ -469,7 +470,7 @@ class Indexer // Setting phash / phash_grouping which identifies the indexed page based on some of these variables: $this->setT3Hashes(); // Indexer configuration from Extension Manager interface: - $this->indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $this->indexerConfig = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search'); $this->tstamp_minAge = MathUtility::forceIntegerInRange($this->indexerConfig['minAge'] * 3600, 0); $this->tstamp_maxAge = MathUtility::forceIntegerInRange($this->indexerConfig['maxAge'] * 3600, 0); $this->maxExternalFiles = MathUtility::forceIntegerInRange($this->indexerConfig['maxExternalFiles'], 0, 1000, 5); diff --git a/typo3/sysext/indexed_search/Classes/Service/DatabaseSchemaService.php b/typo3/sysext/indexed_search/Classes/Service/DatabaseSchemaService.php index 21ce31ea8ffd2465d23b528cecb42a2e92a7b2d1..9f798ca72b2fe5842d278e5332de71a165adfdab 100644 --- a/typo3/sysext/indexed_search/Classes/Service/DatabaseSchemaService.php +++ b/typo3/sysext/indexed_search/Classes/Service/DatabaseSchemaService.php @@ -13,6 +13,8 @@ namespace TYPO3\CMS\IndexedSearch\Service; * * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Utility\GeneralUtility; /** * This service provides the mysql specific changes of the schema definition @@ -28,16 +30,8 @@ class DatabaseSchemaService */ public function addMysqlFulltextIndex(array $sqlString) { - // Check again if the extension flag is enabled to be on the safe side - // even if the slot registration is moved around in ext_localconf - $extConf = []; - if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'])) { - $extConf = unserialize( - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], - ['allowed_classes' => false] - ); - } - if (isset($extConf['useMysqlFulltext']) && $extConf['useMysqlFulltext'] === '1') { + $useMysqlFulltext = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search', 'useMysqlFulltext'); + if ($useMysqlFulltext) { // @todo: With MySQL 5.7 fulltext index on InnoDB is possible, check for that and keep inno if so. $sqlString[] = 'CREATE TABLE index_fulltext (' . LF . 'fulltextdata mediumtext,' diff --git a/typo3/sysext/indexed_search/Tests/Functional/Tca/IndexConfigVisibleFieldsTest.php b/typo3/sysext/indexed_search/Tests/Functional/Tca/IndexConfigVisibleFieldsTest.php deleted file mode 100644 index 56648fbc9fe6ee3be2fef2eb3859973c12f1e433..0000000000000000000000000000000000000000 --- a/typo3/sysext/indexed_search/Tests/Functional/Tca/IndexConfigVisibleFieldsTest.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -namespace TYPO3\CMS\IndexedSearch\Tests\Functional\Tca; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Backend\Tests\Functional\Form\FormTestService; -use TYPO3\CMS\Core\Localization\LanguageService; -use TYPO3\CMS\Core\Utility\GeneralUtility; - -class IndexConfigVisibleFieldsTest extends \TYPO3\TestingFramework\Core\Functional\FunctionalTestCase -{ - protected static $commonIndexConfigFields = [ - 'title', - 'starttime', - 'hidden', - 'description', - 'timer_next_indexing', - 'timer_offset', - 'timer_frequency', - 'type', - ]; - - protected static $indexConfigFieldsByType = [ - '0' => [], - '1' => [ - 'table2index', - 'alternative_source_pid', - 'fieldlist', - 'get_params', - 'chashcalc', - 'recordsbatch', - 'records_indexonchange', - ], - '2' => [ - 'filepath', - 'extensions', - 'depth', - ], - '3' => [ - 'externalUrl', - 'depth', - 'url_deny', - ], - '4' => [ - 'alternative_source_pid', - 'depth', - ], - ]; - - protected static $metaIndexConfigFields = [ - 'title', - 'description', - 'type', - 'indexcfgs', - ]; - - protected $coreExtensionsToLoad = ['indexed_search']; - - /** - * @test - */ - public function indexConfigFormContainsExpectedFields() - { - $this->setUpBackendUserFromFixture(1); - $GLOBALS['LANG'] = GeneralUtility::makeInstance(LanguageService::class); - - $formEngineTestService = GeneralUtility::makeInstance(FormTestService::class); - - foreach (static::$indexConfigFieldsByType as $type => $additionalFields) { - $formResult = $formEngineTestService->createNewRecordForm('index_config', ['type' => $type]); - $expectedFields = array_merge(static::$commonIndexConfigFields, $additionalFields); - - foreach ($expectedFields as $expectedField) { - $this->assertNotFalse( - $formEngineTestService->formHtmlContainsField($expectedField, $formResult['html']), - 'The field ' . $expectedField . ' is not in the form HTML for index type ' . $type - ); - } - - $this->assertNotFalse( - strpos($formResult['html'], 'Session ID'), - 'The field Session ID is not in the form HTML' - ); - } - } - - /** - * @test - */ - public function indexConfigFormContainsExpectedFieldsForMetaConfiguration() - { - $this->setUpBackendUserFromFixture(1); - $GLOBALS['LANG'] = GeneralUtility::makeInstance(LanguageService::class); - - $formEngineTestService = GeneralUtility::makeInstance(FormTestService::class); - $formResult = $formEngineTestService->createNewRecordForm('index_config', ['type' => '5']); - - foreach (static::$metaIndexConfigFields as $expectedField) { - $this->assertNotFalse( - $formEngineTestService->formHtmlContainsField($expectedField, $formResult['html']), - 'The field ' . $expectedField . ' is not in the form HTML for index type ' . $type - ); - } - } -} diff --git a/typo3/sysext/indexed_search/ext_localconf.php b/typo3/sysext/indexed_search/ext_localconf.php index 2e34627a8c939e2f0cebfc78f77270f87b025e18..4bff46a4e9ea060b7bd05edd4ee9999dabc371ac 100644 --- a/typo3/sysext/indexed_search/ext_localconf.php +++ b/typo3/sysext/indexed_search/ext_localconf.php @@ -44,16 +44,11 @@ $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['indexed_search']['external_parsers'] = [ 'tif' => \TYPO3\CMS\IndexedSearch\FileContentParser::class ]; -// unserializing the configuration so we can use it here: -$extConf = []; -if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'])) { - $extConf = unserialize( - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], - ['allowed_classes' => false] - ); -} +$extConf = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( + \TYPO3\CMS\Core\Configuration\ExtensionConfiguration::class +)->get('indexed_search'); -if (isset($extConf['useMysqlFulltext']) && $extConf['useMysqlFulltext'] === '1') { +if (isset($extConf['useMysqlFulltext']) && (bool)$extConf['useMysqlFulltext']) { // Use all index_* tables except "index_rel" and "index_words" $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['indexed_search']['use_tables'] = 'index_phash,index_fulltext,index_section,index_grlist,index_stat_search,index_stat_word,index_debug,index_config'; diff --git a/typo3/sysext/install/Classes/Controller/LayoutController.php b/typo3/sysext/install/Classes/Controller/LayoutController.php index 952332545a1e2a0cefa2015299d100993d3ab3a2..7dd54bba3f1c56c93df48f90b5c65b69c73ce8da 100644 --- a/typo3/sysext/install/Classes/Controller/LayoutController.php +++ b/typo3/sysext/install/Classes/Controller/LayoutController.php @@ -17,9 +17,11 @@ namespace TYPO3\CMS\Install\Controller; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use TYPO3\CMS\Core\Configuration\ConfigurationManager; use TYPO3\CMS\Core\Http\HtmlResponse; use TYPO3\CMS\Core\Http\JsonResponse; use TYPO3\CMS\Install\Service\Exception\ConfigurationChangedException; +use TYPO3\CMS\Install\Service\ExtensionConfigurationService; use TYPO3\CMS\Install\Service\SilentConfigurationUpgradeService; /** @@ -57,7 +59,8 @@ class LayoutController extends AbstractController /** * Return a json response with the main HTML layout body: Toolbar, main menu and - * doc header in standalone, doc header only in backend context. + * doc header in standalone, doc header only in backend context. Silent updaters + * are executed before this main view is loaded. * * @param ServerRequestInterface $request * @return ResponseInterface @@ -89,4 +92,68 @@ class LayoutController extends AbstractController 'success' => $success, ]); } + + /** + * Legacy ajax call. This silent updater takes care that all extensions configured in LocalConfiguration + * EXT/extConf serialized array are "upmerged" to arrays within EXTENSIONS if this extension does not + * exist in EXTENSIONS yet. + * + * @return ResponseInterface + * @deprecated since core v9, will be removed with core v10 + */ + public function executeSilentLegacyExtConfExtensionConfigurationUpdateAction(): ResponseInterface + { + $configurationManager = new ConfigurationManager(); + $oldExtConfSettings = $configurationManager->getConfigurationValueByPath('EXT/extConf'); + $newExtensionSettings = $configurationManager->getConfigurationValueByPath('EXTENSIONS'); + foreach ($oldExtConfSettings as $extensionName => $extensionSettings) { + if (!array_key_exists($extensionName, $newExtensionSettings)) { + $newExtensionSettings = $this->removeDotsFromArrayKeysRecursive(unserialize($extensionSettings, ['allowed_classes' => false])); + $configurationManager->setLocalConfigurationValueByPath('EXTENSIONS/' . $extensionName, $newExtensionSettings); + } + } + return new JsonResponse([ + 'success' => true, + ]); + } + + /** + * Synchronize TYPO3_CONF_VARS['EXTENSIONS'] with possibly new defaults from extensions + * ext_conf_template.txt files. This make LocalConfiguration the only source of truth for + * extension configuration and it is always up to date, also if an extension has been + * updated. + * + * @return ResponseInterface + */ + public function executeSilentExtensionConfigurationSynchronizationAction(): ResponseInterface + { + $extensionConfigurationService = new ExtensionConfigurationService(); + $extensionConfigurationService->synchronizeExtConfTemplateWithLocalConfigurationOfAllExtensions(); + return new JsonResponse([ + 'success' => true, + ]); + } + + /** + * Helper method for executeSilentLegacyExtConfExtensionConfigurationUpdateAction(). Old EXT/extConf + * settings have dots at the end of array keys if nested arrays were used. The new configuration does + * not use this funny nested representation anymore. The method removes all dots at the end of given + * array keys recursive to do this transition. + * + * @param array $settings + * @return array New settings + * @deprecated since core v9, will be removed with core v10 along with executeSilentLegacyExtConfExtensionConfigurationUpdateAction() + */ + private function removeDotsFromArrayKeysRecursive(array $settings): array + { + $settingsWithoutDots = []; + foreach ($settings as $key => $value) { + if (is_array($value)) { + $settingsWithoutDots[rtrim($key, '.')] = $this->removeDotsFromArrayKeysRecursive($value); + } else { + $settingsWithoutDots[$key] = $value; + } + } + return $settingsWithoutDots; + } } diff --git a/typo3/sysext/install/Classes/Controller/SettingsController.php b/typo3/sysext/install/Classes/Controller/SettingsController.php index 35d4292e993ea78656aade525203ecbdc3a9dcd3..f24a84edf1082a44e7bb87157f99a0ba532602fc 100644 --- a/typo3/sysext/install/Classes/Controller/SettingsController.php +++ b/typo3/sysext/install/Classes/Controller/SettingsController.php @@ -18,6 +18,8 @@ namespace TYPO3\CMS\Install\Controller; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Core\Configuration\ConfigurationManager; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Core\Bootstrap; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; @@ -25,9 +27,12 @@ use TYPO3\CMS\Core\FormProtection\InstallToolFormProtection; use TYPO3\CMS\Core\Http\JsonResponse; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Messaging\FlashMessageQueue; +use TYPO3\CMS\Core\Package\PackageManager; +use TYPO3\CMS\Core\Utility\ArrayUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; use TYPO3\CMS\Install\Configuration\FeatureManager; +use TYPO3\CMS\Install\Service\ExtensionConfigurationService; use TYPO3\CMS\Install\Service\LocalConfigurationValueService; use TYPO3\CMS\Saltedpasswords\Salt\SaltFactory; @@ -308,4 +313,65 @@ class SettingsController extends AbstractController 'status' => $messages, ]); } + + /** + * Render a list of extensions with their configuration form. + * + * @param ServerRequestInterface $request + * @return ResponseInterface + */ + public function extensionConfigurationGetContentAction(ServerRequestInterface $request): ResponseInterface + { + // Extension configuration needs initialized $GLOBALS['LANG'] + Bootstrap::getInstance()->initializeLanguageObject(); + $extensionConfigurationService = new ExtensionConfigurationService(); + $extensionsWithConfigurations = []; + $activePackages = GeneralUtility::makeInstance(PackageManager::class)->getActivePackages(); + foreach ($activePackages as $extensionKey => $activePackage) { + if (@file_exists($activePackage->getPackagePath() . 'ext_conf_template.txt')) { + $extensionsWithConfigurations[$extensionKey] = [ + 'packageInfo' => $activePackage, + 'configuration' => $extensionConfigurationService->getConfigurationPreparedForView($extensionKey), + ]; + } + } + $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class); + $view = $this->initializeStandaloneView($request, 'Settings/ExtensionConfigurationGetContent.html'); + $view->assignMultiple([ + 'extensionsWithConfigurations' => $extensionsWithConfigurations, + 'extensionConfigurationWriteToken' => $formProtection->generateToken('installTool', 'extensionConfigurationWrite'), + ]); + return new JsonResponse([ + 'success' => true, + 'html' => $view->render(), + ]); + } + + /** + * Write extension configuration + * + * @param ServerRequestInterface $request + * @return ResponseInterface + */ + public function extensionConfigurationWriteAction(ServerRequestInterface $request): ResponseInterface + { + $extensionKey = $request->getParsedBody()['install']['extensionKey']; + $configuration = $request->getParsedBody()['install']['extensionConfiguration']; + $nestedConfiguration = []; + foreach ($configuration as $configKey => $value) { + $nestedConfiguration = ArrayUtility::setValueByPath($nestedConfiguration, $configKey, $value, '.'); + } + (new ExtensionConfiguration())->set($extensionKey, '', $nestedConfiguration); + $messages = [ + new FlashMessage( + '', + 'Successfully saved configuration for extension "' . $extensionKey . '"', + FlashMessage::OK + ) + ]; + return new JsonResponse([ + 'success' => true, + 'status' => $messages, + ]); + } } diff --git a/typo3/sysext/extensionmanager/Classes/Utility/ConfigurationUtility.php b/typo3/sysext/install/Classes/Service/ExtensionConfigurationService.php similarity index 61% rename from typo3/sysext/extensionmanager/Classes/Utility/ConfigurationUtility.php rename to typo3/sysext/install/Classes/Service/ExtensionConfigurationService.php index 7c8081d0a4a330d72200bbd714fb44adab90b16a..2fb31246f39aa5f2b3867de88a11c4388148f1b5 100644 --- a/typo3/sysext/extensionmanager/Classes/Utility/ConfigurationUtility.php +++ b/typo3/sysext/install/Classes/Service/ExtensionConfigurationService.php @@ -1,5 +1,6 @@ <?php -namespace TYPO3\CMS\Extensionmanager\Utility; +declare(strict_types=1); +namespace TYPO3\CMS\Install\Service; /* * This file is part of the TYPO3 CMS project. @@ -14,44 +15,61 @@ namespace TYPO3\CMS\Extensionmanager\Utility; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationExtensionNotConfiguredException; +use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationPathDoesNotExistException; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Localization\LanguageService; +use TYPO3\CMS\Core\Package\PackageManager; use TYPO3\CMS\Core\Utility\ArrayUtility; -use TYPO3\CMS\Lang\LanguageService; +use TYPO3\CMS\Core\Utility\GeneralUtility; /** - * Utility for dealing with ext_emconf and ext_conf_template settings + * Utility for dealing with ext_conf_template settings and their instance + * specific LocalConfiguration settings. This class is @internal and only + * used by extension manager and install tool itself. + * + * Extension authors should use TYPO3\CMS\Core\Configuration\ExtensionConfiguration + * class to get() and set() extension configuration settings. + * + * @internal */ -class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface +class ExtensionConfigurationService { /** - * TypoScript hierarchy being build during parsing. + * TypoScript hierarchy being build. + * Used parsing ext_conf_template.txt * * @var array */ protected $setup = []; /** - * Raw data, the input string exploded by LF + * Raw data, the input string exploded by LF. + * Used parsing ext_conf_template.txt * * @var array */ protected $raw; /** - * Pointer to entry in raw data array + * Pointer to entry in raw data array. + * Used parsing ext_conf_template.txt * * @var int */ - protected $rawP = 0; + protected $rawPointer = 0; /** * Holding the value of the last comment + * Used parsing ext_conf_template.txt * * @var string */ protected $lastComment = ''; /** - * Internally set, used as internal flag to create a multi-line comment (one of those like /* ... * / + * Internal flag to create a multi-line comment (one of those like /* ... * /) + * Used parsing ext_conf_template.txt * * @var bool */ @@ -59,6 +77,7 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface /** * Internally set, when in brace. Counter. + * Used parsing ext_conf_template.txt * * @var int */ @@ -66,6 +85,7 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface /** * This will be filled with the available categories of the current template. + * Used parsing ext_conf_template.txt * * @var array */ @@ -99,75 +119,183 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface ]; /** - * @var \TYPO3\CMS\Extbase\Object\ObjectManager + * If there are new config settings in ext_conf_template of an extenison, + * they are found here and synchronized to LocalConfiguration['EXTENSIONS']. + * + * Used when entering the install tool and during installation. */ - protected $objectManager; + public function synchronizeExtConfTemplateWithLocalConfigurationOfAllExtensions() + { + $activePackages = GeneralUtility::makeInstance(PackageManager::class)->getActivePackages(); + foreach ($activePackages as $package) { + $this->synchronizeExtConfTemplateWithLocalConfiguration($package->getPackageKey()); + } + } /** - * @param \TYPO3\CMS\Extbase\Object\ObjectManager $objectManager + * Read values from ext_conf_template, verify if they are in LocalConfiguration.php + * already and if not, add them. + * + * Used public by extension manager when updating extension + * + * @param string $extensionKey The extension to sync */ - public function injectObjectManager(\TYPO3\CMS\Extbase\Object\ObjectManager $objectManager) + public function synchronizeExtConfTemplateWithLocalConfiguration(string $extensionKey) { - $this->objectManager = $objectManager; + $package = GeneralUtility::makeInstance(PackageManager::class)->getPackage($extensionKey); + if (!@is_file($package->getPackagePath() . 'ext_conf_template.txt')) { + return; + } + $extensionConfiguration = new ExtensionConfiguration(); + try { + $currentLocalConfiguration = $extensionConfiguration->get($extensionKey); + } catch (ExtensionConfigurationExtensionNotConfiguredException $e) { + $currentLocalConfiguration = []; + } + $extConfTemplateConfiguration = $this->getExtConfTablesWithoutCommentsAsNestedArrayWithoutDots($extensionKey); + ArrayUtility::mergeRecursiveWithOverrule($extConfTemplateConfiguration, $currentLocalConfiguration); + $extensionConfiguration->set($extensionKey, '', $extConfTemplateConfiguration); } /** - * Get default configuration from ext_conf_template of an extension - * and save as initial configuration to LocalConfiguration ['EXT']['extConf']. - * - * Used by the InstallUtility to initialize local extension config. + * Compiles ext_conf_template file and merges it with values from LocalConfiguration['EXTENSIONS']. + * Returns a funny array used to display the configuration form in the install tool. * * @param string $extensionKey Extension key + * @return array */ - public function saveDefaultConfiguration($extensionKey) + public function getConfigurationPreparedForView(string $extensionKey): array { - $currentConfiguration = $this->getCurrentConfiguration($extensionKey); - $nestedConfiguration = $this->convertValuedToNestedConfiguration($currentConfiguration); - $this->writeConfiguration($nestedConfiguration, $extensionKey); + $package = GeneralUtility::makeInstance(PackageManager::class)->getPackage($extensionKey); + if (!@is_file($package->getPackagePath() . 'ext_conf_template.txt')) { + return []; + } + $extensionConfiguration = new ExtensionConfiguration(); + $configuration = $this->getDefaultConfigurationFromExtConfTemplateAsValuedArray($extensionKey); + foreach ($configuration as $configurationPath => &$details) { + try { + $valueFromLocalConfiguration = $extensionConfiguration->get($extensionKey, str_replace('.', '/', $configurationPath)); + $details['value'] = $valueFromLocalConfiguration; + } catch (ExtensionConfigurationPathDoesNotExistException $e) { + // Deliberately empty - it can happen at runtime that a written config does not return + // back all values (eg. saltedpassword with its userFuncs), which then miss in the written + // configuration and are only synced after next install tool run. This edge case is + // taken care off here. + } + } + $resultArray = []; + if (!empty($configuration)) { + $hierarchicConfiguration = []; + foreach ($configuration as $configurationOption) { + $originalConfiguration = $this->buildConfigurationArray($configurationOption); + ArrayUtility::mergeRecursiveWithOverrule($originalConfiguration, $hierarchicConfiguration); + $hierarchicConfiguration = $originalConfiguration; + } + // Flip category array as it was merged the other way around + $hierarchicConfiguration = array_reverse($hierarchicConfiguration); + // Sort configurations of each subcategory + foreach ($hierarchicConfiguration as &$catConfigurationArray) { + foreach ($catConfigurationArray as &$subcatConfigurationArray) { + uasort($subcatConfigurationArray, function ($a, $b) { + return strnatcmp($a['subcat'], $b['subcat']); + }); + } + unset($subcatConfigurationArray); + } + unset($tempConfiguration); + $resultArray = $hierarchicConfiguration; + } + return $resultArray; } /** - * Writes extension specific configuration to LocalConfiguration file - * in array ['EXT']['extConf'][$extensionKey]. - * - * Removes core cache files afterwards. - * - * This low level method expects a nested configuration array that - * was already merged with default configuration and maybe new form values. - * - * @param array $configuration Configuration to save - * @param string $extensionKey Extension key + * Poor man version of getDefaultConfigurationFromExtConfTemplateAsValuedArray() which ignores + * comments and returns ext_conf_template as array where nested keys have no dots. */ - public function writeConfiguration(array $configuration = [], $extensionKey) + protected function getExtConfTablesWithoutCommentsAsNestedArrayWithoutDots(string $extensionKey) { - /** @var $configurationManager \TYPO3\CMS\Core\Configuration\ConfigurationManager */ - $configurationManager = $this->objectManager->get(\TYPO3\CMS\Core\Configuration\ConfigurationManager::class); - $configurationManager->setLocalConfigurationValueByPath('EXT/extConf/' . $extensionKey, serialize($configuration)); - $configurationManager->setLocalConfigurationValueByPath('EXTENSIONS/' . $extensionKey, $configuration); + $rawConfigurationString = $this->getDefaultConfigurationRawString($extensionKey); + $configuration = []; + if ((string)$rawConfigurationString !== '') { + $this->raw = explode(LF, $rawConfigurationString); + $this->rawPointer = 0; + $this->setup = []; + $this->parseSub($this->setup); + if ($this->inBrace) { + throw new \RuntimeException( + 'Line ' . ($this->rawPointer - 1) . ': The script is short of ' . $this->inBrace . ' end brace(s)', + 1507645349 + ); + } + $configuration = $this->removeCommentsAndDotsRecursive($this->setup); + } + return $configuration; } /** - * Get current configuration of an extension. Will return the configuration as a valued object + * Builds a configuration array from each line (option) of the config file. + * Helper method for getConfigurationPreparedForView() * - * @param string $extensionKey + * @param array $configurationOption config file line representing one setting * @return array */ - public function getCurrentConfiguration(string $extensionKey): array + protected function buildConfigurationArray(array $configurationOption): array { - $mergedConfiguration = $this->getDefaultConfigurationFromExtConfTemplateAsValuedArray($extensionKey); - - // @deprecated loading serialized configuration is deprecated and will be removed in v10 - use EXTENSIONS array instead - // No objects allowed in extConf at all - it is safe to deny that during unserialize() - $legacyCurrentExtensionConfiguration = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][$extensionKey], ['allowed_classes' => false]); - $legacyCurrentExtensionConfiguration = is_array($legacyCurrentExtensionConfiguration) ? $legacyCurrentExtensionConfiguration : []; - $mergedConfiguration = $this->mergeExtensionConfigurations($mergedConfiguration, $legacyCurrentExtensionConfiguration); + $hierarchicConfiguration = []; + if (GeneralUtility::isFirstPartOfStr($configurationOption['type'], 'user')) { + $configurationOption = $this->extractInformationForConfigFieldsOfTypeUser($configurationOption); + } elseif (GeneralUtility::isFirstPartOfStr($configurationOption['type'], 'options')) { + $configurationOption = $this->extractInformationForConfigFieldsOfTypeOptions($configurationOption); + } + $languageService = $this->getLanguageService(); + if (is_string($configurationOption['label'])) { + $translatedLabel = $languageService->sL($configurationOption['label']); + if ($translatedLabel) { + $configurationOption['label'] = $translatedLabel; + } + } + $configurationOption['labels'] = GeneralUtility::trimExplode(':', $configurationOption['label'], false, 2); + $configurationOption['subcat_name'] = $configurationOption['subcat_name'] ?: '__default'; + $hierarchicConfiguration[$configurationOption['cat']][$configurationOption['subcat_name']][$configurationOption['name']] = $configurationOption; + return $hierarchicConfiguration; + } - if (isset($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extensionKey]) && is_array($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extensionKey])) { - $currentExtensionConfiguration = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extensionKey]; - $mergedConfiguration = $this->mergeExtensionConfigurations($mergedConfiguration, $currentExtensionConfiguration); + /** + * Extracts additional information for fields of type "options" + * Extracts "type", "label" and values information + * + * @param array $configurationOption + * @return array + */ + protected function extractInformationForConfigFieldsOfTypeOptions(array $configurationOption): array + { + preg_match('/options\[(.*)\]/is', $configurationOption['type'], $typeMatches); + $optionItems = GeneralUtility::trimExplode(',', $typeMatches[1]); + foreach ($optionItems as $optionItem) { + $optionPair = GeneralUtility::trimExplode('=', $optionItem); + if (count($optionPair) === 2) { + $configurationOption['generic'][$optionPair[0]] = $optionPair[1]; + } else { + $configurationOption['generic'][$optionPair[0]] = $optionPair[0]; + } } + $configurationOption['type'] = 'options'; + return $configurationOption; + } - return $mergedConfiguration; + /** + * Extract additional information for fields of type "user" + * Extracts "type" and the function to be called + * + * @param array $configurationOption + * @return array + */ + protected function extractInformationForConfigFieldsOfTypeUser(array $configurationOption): array + { + preg_match('/user\\[(.*)\\]/is', $configurationOption['type'], $matches); + $configurationOption['generic'] = $matches[1]; + $configurationOption['type'] = 'user'; + return $configurationOption; } /** @@ -194,16 +322,18 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface * @param string $extensionKey Extension key * @return array */ - public function getDefaultConfigurationFromExtConfTemplateAsValuedArray($extensionKey) + protected function getDefaultConfigurationFromExtConfTemplateAsValuedArray(string $extensionKey): array { $rawConfigurationString = $this->getDefaultConfigurationRawString($extensionKey); $theConstants = []; if ((string)$rawConfigurationString !== '') { $this->raw = explode(LF, $rawConfigurationString); + $this->rawPointer = 0; + $this->setup = []; $this->parseSub($this->setup); if ($this->inBrace) { throw new \RuntimeException( - 'Line ' . ($this->rawP - 1) . ': The script is short of ' . $this->inBrace . ' end brace(s)', + 'Line ' . ($this->rawPointer - 1) . ': The script is short of ' . $this->inBrace . ' end brace(s)', 1507645348 ); } @@ -223,7 +353,6 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface } } } - return $theConstants; } @@ -234,10 +363,10 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface * @param string $extensionKey Extension key * @return string */ - protected function getDefaultConfigurationRawString($extensionKey) + protected function getDefaultConfigurationRawString(string $extensionKey): string { $rawString = ''; - $extConfTemplateFileLocation = \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName( + $extConfTemplateFileLocation = GeneralUtility::getFileAbsFileName( 'EXT:' . $extensionKey . '/ext_conf_template.txt' ); if (file_exists($extConfTemplateFileLocation)) { @@ -246,91 +375,6 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface return $rawString; } - /** - * Converts a valued configuration to a nested configuration. - * - * array('first.second' => array('value' => 1)) - * will become - * array('first.' => array('second' => )) - * - * @param array $valuedConfiguration - * @return array - */ - public function convertValuedToNestedConfiguration(array $valuedConfiguration) - { - $nestedConfiguration = []; - foreach ($valuedConfiguration as $name => $section) { - $path = str_replace('.', './', $name); - $nestedConfiguration = ArrayUtility::setValueByPath($nestedConfiguration, $path, $section['value'], '/'); - } - return $nestedConfiguration; - } - - /** - * Convert a nested configuration to a valued configuration - * - * array('first.' => array('second' => 1)) - * will become - * array('first.second' => array('value' => 1) - * @param array $nestedConfiguration - * @return array - */ - public function convertNestedToValuedConfiguration(array $nestedConfiguration) - { - $flatExtensionConfig = ArrayUtility::flatten($nestedConfiguration); - $valuedCurrentExtensionConfig = []; - foreach ($flatExtensionConfig as $key => $value) { - $valuedCurrentExtensionConfig[$key]['value'] = $value; - } - return $valuedCurrentExtensionConfig; - } - - /** - * Merges two existing configuration arrays, - * expects configuration as valued flat structure - * and overrides as nested array - * - * @see convertNestedToValuedConfiguration - * - * @param array $configuration - * @param array $configurationOverride - * - * @return array - */ - private function mergeExtensionConfigurations(array $configuration, array $configurationOverride): array - { - $configurationOverride = $this->convertNestedToValuedConfiguration( - $configurationOverride - ); - ArrayUtility::mergeRecursiveWithOverrule( - $configuration, - $configurationOverride - ); - return $configuration; - } - - /** - * This flattens a hierarchical TypoScript array to $this->flatSetup - * - * @param array $setupArray TypoScript array - * @param string $prefix Prefix to the object path. Used for recursive calls to this function. - * @return array - */ - protected function flattenSetup($setupArray, $prefix = '') - { - $flatSetup = []; - if (is_array($setupArray)) { - foreach ($setupArray as $key => $val) { - if (is_array($val)) { - $flatSetup = array_merge($flatSetup, $this->flattenSetup($val, $prefix . $key)); - } else { - $flatSetup[$prefix . $key] = $val; - } - } - } - return $flatSetup; - } - /** * This function compares the flattened constants (default and all). * Returns an array with the constants from the whole template which may be edited by the module. @@ -374,7 +418,7 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface $editableComments[$const]['cat'] = $catSplit[0]; // This is the subcategory. Must be a key in $this->subCategories[]. // catSplit[2] represents the search-order within the subcat. - $catSplit[1] = trim($catSplit[1]); + $catSplit[1] = !empty($catSplit[1]) ? trim($catSplit[1]) : ''; if ($catSplit[1] && isset($this->subCategories[$catSplit[1]])) { $editableComments[$const]['subcat_name'] = $catSplit[1]; $orderIdentifier = isset($catSplit[2]) ? trim($catSplit[2]) : $counter; @@ -426,9 +470,9 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface */ protected function parseSub(array &$setup) { - while (isset($this->raw[$this->rawP])) { - $line = ltrim($this->raw[$this->rawP]); - $this->rawP++; + while (isset($this->raw[$this->rawPointer])) { + $line = ltrim($this->raw[$this->rawPointer]); + $this->rawPointer++; // Set comment flag? if (strpos($line, '/*') === 0) { $this->commentSet = 1; @@ -448,14 +492,14 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface $r = []; if (preg_match('/[^[:alnum:]_\\\\\\.:-]/i', $objStrName, $r)) { throw new \RuntimeException( - 'Line ' . ($this->rawP - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" contains invalid character "' . $r[0] . '". Must be alphanumeric or one of: "_:-\\."', + 'Line ' . ($this->rawPointer - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" contains invalid character "' . $r[0] . '". Must be alphanumeric or one of: "_:-\\."', 1507645381 ); } $line = ltrim(substr($line, $varL)); if ($line === '') { throw new \RuntimeException( - 'Line ' . ($this->rawP - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" was not followed by any operator, =<>({', + 'Line ' . ($this->rawPointer - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" was not followed by any operator, =<>({', 1507645417 ); } @@ -486,7 +530,7 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface break; default: throw new \RuntimeException( - 'Line ' . ($this->rawP - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" was not followed by any operator, =<>({', + 'Line ' . ($this->rawPointer - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" was not followed by any operator, =<>({', 1507645445 ); } @@ -498,7 +542,7 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface $this->lastComment = ''; if ($this->inBrace < 0) { throw new \RuntimeException( - 'Line ' . ($this->rawP - 1) . ': An end brace is in excess.', + 'Line ' . ($this->rawPointer - 1) . ': An end brace is in excess.', 1507645489 ); } @@ -622,6 +666,65 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface return [$keySegment, $remainingKey]; } + /** + * "Comments" from the "TypoScript" parser below are identified by two (!) dots at the end of array keys + * and all array keys have a single dot at the end, if they have sub arrays. This is cleaned here. + * + * Incoming array: + * [ + * 'automaticInstallation' => '1', + * 'automaticInstallation..' => '# cat=basic/enabled; ...' + * 'FE.' => [ + * 'enabled' = '1', + * 'enabled..' => '# cat=basic/enabled; ...' + * ] + * ] + * + * Output array: + * [ + * 'automaticInstallation' => '1', + * 'FE' => [ + * 'enabled' => '1', + * ] + */ + protected function removeCommentsAndDotsRecursive(array $config): array + { + $cleanedConfig = []; + foreach ($config as $key => $value) { + if (substr($key, -2) === '..') { + continue; + } + if (substr($key, -1) === '.') { + $cleanedConfig[rtrim($key, '.')] = $this->removeCommentsAndDotsRecursive($value); + } else { + $cleanedConfig[$key] = $value; + } + } + return $cleanedConfig; + } + + /** + * This flattens a hierarchical TypoScript array to a dotted notation + * + * @param array $setupArray TypoScript array + * @param string $prefix Prefix to the object path. Used for recursive calls to this function. + * @return array + */ + protected function flattenSetup($setupArray, $prefix = '') + { + $flatSetup = []; + if (is_array($setupArray)) { + foreach ($setupArray as $key => $val) { + if (is_array($val)) { + $flatSetup = array_merge($flatSetup, $this->flattenSetup($val, $prefix . $key)); + } else { + $flatSetup[$prefix . $key] = $val; + } + } + } + return $flatSetup; + } + /** * @return LanguageService */ diff --git a/typo3/sysext/extensionmanager/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php b/typo3/sysext/install/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php similarity index 64% rename from typo3/sysext/extensionmanager/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php rename to typo3/sysext/install/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php index 66478bb0dac6cc05cc8b9ee5c71507215eb4832c..e7b054f2de26b90e8b48b374daaa48902cb2ab9f 100644 --- a/typo3/sysext/extensionmanager/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php +++ b/typo3/sysext/install/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php @@ -1,5 +1,6 @@ <?php -namespace TYPO3\CMS\Extensionmanager\ViewHelpers\Form; +declare(strict_types=1); +namespace TYPO3\CMS\Install\ViewHelpers\Form; /* * This file is part of the TYPO3 CMS project. @@ -14,14 +15,16 @@ namespace TYPO3\CMS\Extensionmanager\ViewHelpers\Form; * The TYPO3 project - inspiring people to share! */ -use TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem; +use TYPO3\CMS\Core\Localization\LanguageService; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper; use TYPO3\CMS\Fluid\ViewHelpers\FormViewHelper; /** - * View Helper for rendering Extension Manager Configuration Form + * View Helper for rendering extension configuration forms * @internal */ -class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper +class TypoScriptConstantsViewHelper extends AbstractTagBasedViewHelper { /** * @var array @@ -55,7 +58,7 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs parent::initializeArguments(); $this->registerArgument('name', 'string', 'Name of input tag'); $this->registerArgument('value', 'mixed', 'Value of input tag'); - $this->registerArgument('configuration', ConfigurationItem::class, '', true); + $this->registerArgument('configuration', 'array', '', true); $this->registerUniversalTagAttributes(); } @@ -64,12 +67,12 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs * * @return string the rendered tag */ - public function render() + public function render(): string { - /** @var ConfigurationItem $configuration */ + /** @var array $configuration */ $configuration = $this->arguments['configuration']; - if (isset($this->viewHelperMapping[$configuration->getType()]) && method_exists($this, $this->viewHelperMapping[$configuration->getType()])) { - $input = $this->{$this->viewHelperMapping[$configuration->getType()]}($configuration); + if (isset($this->viewHelperMapping[$configuration['type']]) && method_exists($this, $this->viewHelperMapping[$configuration['type']])) { + $input = $this->{$this->viewHelperMapping[$configuration['type']]}($configuration); } else { $input = $this->{$this->viewHelperMapping['default']}($configuration); } @@ -80,12 +83,12 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type color picker * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderColorPicker(ConfigurationItem $configuration) + protected function renderColorPicker(array $configuration): string { - $elementId = 'em-' . $configuration->getName(); + $elementId = 'em-' . $configuration['name']; $elementName = $this->getName($configuration); // configure the field @@ -95,8 +98,8 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs $this->tag->addAttribute('name', $elementName); $this->tag->addAttribute('data-formengine-input-name', $elementName); $this->tag->addAttribute('class', 'form-control'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } $output = ' @@ -114,18 +117,18 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "offset" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderOffsetField(ConfigurationItem $configuration) + protected function renderOffsetField(array $configuration): string { $this->tag->setTagName('input'); $this->tag->addAttribute('type', 'text'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control t3js-emconf-offset'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } return $this->tag->render(); } @@ -133,18 +136,18 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "wrap" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderWrapField(ConfigurationItem $configuration) + protected function renderWrapField(array $configuration): string { $this->tag->setTagName('input'); $this->tag->addAttribute('type', 'text'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control t3js-emconf-wrap'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } return $this->tag->render(); } @@ -152,23 +155,24 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "option" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderOptionSelect(ConfigurationItem $configuration) + protected function renderOptionSelect(array $configuration): string { $this->tag->setTagName('select'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control'); - $optionValueArray = $configuration->getGeneric(); + $optionValueArray = $configuration['generic']; $output = ''; + $languageService = $this->getLanguageService(); foreach ($optionValueArray as $label => $value) { $output .= '<option value="' . htmlspecialchars($value) . '"'; - if ($configuration->getValue() == $value) { + if ($configuration['value'] == $value) { $output .= ' selected="selected"'; } - $output .= '>' . htmlspecialchars($GLOBALS['LANG']->sL($label)) . '</option>'; + $output .= '>' . htmlspecialchars($languageService->sL($label)) . '</option>'; } $this->tag->setContent($output); return $this->tag->render(); @@ -177,19 +181,19 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "int+" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderPositiveIntegerField(ConfigurationItem $configuration) + protected function renderPositiveIntegerField(array $configuration): string { $this->tag->setTagName('input'); $this->tag->addAttribute('type', 'number'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control'); $this->tag->addAttribute('min', '0'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } return $this->tag->render(); } @@ -197,18 +201,18 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "integer" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderIntegerField(ConfigurationItem $configuration) + protected function renderIntegerField(array $configuration): string { $this->tag->setTagName('input'); $this->tag->addAttribute('type', 'number'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } return $this->tag->render(); } @@ -216,18 +220,18 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "text" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderTextField(ConfigurationItem $configuration) + protected function renderTextField(array $configuration): string { $this->tag->setTagName('input'); $this->tag->addAttribute('type', 'text'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } return $this->tag->render(); } @@ -235,10 +239,10 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "small text" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderSmallTextField(ConfigurationItem $configuration) + protected function renderSmallTextField(array $configuration): string { return $this->renderTextField($configuration); } @@ -246,16 +250,16 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "checkbox" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - public function renderCheckbox(ConfigurationItem $configuration) + public function renderCheckbox(array $configuration): string { $this->tag->addAttribute('type', 'checkbox'); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('value', 1); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); - if ($configuration->getValue() == 1) { + $this->tag->addAttribute('id', 'em-' . $configuration['name']); + if ($configuration['value'] == 1) { $this->tag->addAttribute('checked', 'checked'); } $hiddenField = $this->renderHiddenFieldForEmptyValue($configuration); @@ -265,38 +269,38 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "userFunc" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderUserFunction(ConfigurationItem $configuration) + protected function renderUserFunction(array $configuration): string { - $userFunction = $configuration->getGeneric(); + $userFunction = $configuration['generic']; $userFunctionParams = [ 'fieldName' => $this->getName($configuration), - 'fieldValue' => $configuration->getValue(), - 'propertyName' => $configuration->getName() + 'fieldValue' => $configuration['value'], + 'propertyName' => $configuration['name'] ]; - return \TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunction($userFunction, $userFunctionParams, $this); + return (string)GeneralUtility::callUserFunction($userFunction, $userFunctionParams, $this); } /** * Get Field Name * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function getName(ConfigurationItem $configuration) + protected function getName(array $configuration): string { - return 'tx_extensionmanager_tools_extensionmanagerextensionmanager[config][' . $configuration->getName() . '][value]'; + return $configuration['name']; } /** * Render a hidden field for empty values * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderHiddenFieldForEmptyValue($configuration) + protected function renderHiddenFieldForEmptyValue(array $configuration): string { $hiddenFieldNames = []; if ($this->viewHelperVariableContainer->exists(FormViewHelper::class, 'renderedHiddenFields')) { @@ -313,4 +317,12 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs } return ''; } + + /** + * @return LanguageService|null Returns null if we are in the install tool standalone mode + */ + protected function getLanguageService() + { + return $GLOBALS['LANG']; + } } diff --git a/typo3/sysext/install/Classes/ViewHelpers/Format/NoSpaceViewHelper.php b/typo3/sysext/install/Classes/ViewHelpers/Format/NoSpaceViewHelper.php new file mode 100644 index 0000000000000000000000000000000000000000..93d9720de585574ddbdfc3d4895a6e6e9d961ac8 --- /dev/null +++ b/typo3/sysext/install/Classes/ViewHelpers/Format/NoSpaceViewHelper.php @@ -0,0 +1,52 @@ +<?php +namespace TYPO3\CMS\Install\ViewHelpers\Format; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper; +use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface; +use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic; + +/** + * Remove all spaces in a string + * + * @internal + */ +class NoSpaceViewHelper extends AbstractViewHelper +{ + use CompileWithRenderStatic; + + /** + * Initialize arguments + */ + public function initializeArguments() + { + parent::initializeArguments(); + $this->registerArgument('value', 'string', '', true); + } + + /** + * Render a string with whitespaces stripped + * + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * + * @return string + */ + public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext) + { + return str_replace(' ', '', $arguments['value']); + } +} diff --git a/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration.html b/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration.html new file mode 100644 index 0000000000000000000000000000000000000000..43e63728ace2936e82f49d6f96e80c6788c9d123 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration.html @@ -0,0 +1 @@ +<div class="t3js-extensionConfiguration-content"></div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration/ExtensionForm.html b/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration/ExtensionForm.html new file mode 100644 index 0000000000000000000000000000000000000000..c20651612cef3d16b374effb77b3055f7f61bd24 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration/ExtensionForm.html @@ -0,0 +1,71 @@ +{namespace i=TYPO3\CMS\Install\ViewHelpers} + +<div class="panel panel-default panel-flat searchhit"> + <div class="panel-heading" role="tab" id="heading{extensionKey}"> + <h3 class="panel-title"> + <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse{extensionKey}" + aria-expanded="true" aria-controls="collapse{extensionKey}" class="collapsed" + > + <span class="caret"></span> + <strong>{extensionData.packageInfo.packageKey}</strong> + </a> + </h3> + </div> + <div id="collapse{extensionKey}" class="panel-collapse collapse search-item" role="tabpanel" aria-labelledby="heading{extensionKey}"> + <div class="panel-body"> + <div role="tabpanel"> + <ul class="nav nav-tabs" role="tablist"> + <f:for each="{extensionData.configuration}" as="category" key="categoryName" iteration="iteration"> + <f:if condition="{categoryName}"> + <li role="presentation" class="{f:if(condition:'{iteration.isFirst}', then:'active')}"> + <a class="text-capitalize" href="#{i:format.noSpace(value:'category-{extensionKey}-{categoryName}')}" aria-controls="category-{extensionKey}-{categoryName}" role="tab" data-toggle="tab"> + {categoryName} + </a> + </li> + </f:if> + </f:for> + </ul> + + <form action="#" name="configurationform" class="t3js-extensionConfiguration-form" data-extensionKey="{extensionKey}"> + <div class="tab-content"> + <f:for each="{extensionData.configuration}" as="subcategories" key="categoryName" iteration="iteration"> + <f:if condition="{categoryName}"> + <div role="tabpanel" class="tab-pane {f:if(condition:'{iteration.isFirst}', then:'active')}" id="{i:format.noSpace(value:'category-{extensionKey}-{categoryName}')}"> + <f:for each="{subcategories}" as="subcategory"> + <div class="form-section"> + <f:for each="{subcategory}" as="configurationItem" iteration="itemIterator"> + <f:if condition="{itemIterator.isFirst}"> + <h2 class="h4 form-section-headline">{configurationItem.subcat_label}</h2> + </f:if> + <div class="form-group form-group-dashed"> + <label for="em-{configurationItem.name}"> + {configurationItem.labels.0} + </label> + <p> + {categoryName}.{configurationItem.name} + <f:if condition="{configurationItem.type} != 'user'"> + <f:if condition="{configurationItem.type}"> + ({configurationItem.type}) + </f:if> + </f:if> + </p> + <div class="form-control-wrap"> + <i:form.typoScriptConstants configuration="{configurationItem}" /> + </div> + <f:if condition="{configurationItem.labels.1}"> + <div class="help-block">{configurationItem.labels.1 -> f:format.nl2br()}</div> + </f:if> + </div> + </f:for> + </div> + </f:for> + </div> + </f:if> + </f:for> + </div> + <button type="submit" class="btn btn-default" name="mySubmit">Save "{extensionKey}" configuration</button> + </form> + </div> + </div> + </div> +</div> diff --git a/typo3/sysext/install/Resources/Private/Templates/Settings/Cards.html b/typo3/sysext/install/Resources/Private/Templates/Settings/Cards.html index f519ebd8c1e8e13655d1958aeba0e360bf18553e..83495825b2d04982abd187fa09dc76c56bdbb7c2 100644 --- a/typo3/sysext/install/Resources/Private/Templates/Settings/Cards.html +++ b/typo3/sysext/install/Resources/Private/Templates/Settings/Cards.html @@ -30,6 +30,13 @@ title: 'Configure installation-wide options', category: 'Global Configuration', description: 'Modify settings to be written into TYPO3\'s LocalConfiguration.php.' + }, + 4: {partial: 'Settings/ExtensionConfiguration', + require: 'TYPO3/CMS/Install/ExtensionConfiguration', + baseClass: 't3js-extensionConfiguration', + title: 'Extension configuration', + category: 'Glocal Configuration', + description: 'Configure settings for extensions.' } }}"> <div class="gridder"> diff --git a/typo3/sysext/install/Resources/Private/Templates/Settings/ExtensionConfigurationGetContent.html b/typo3/sysext/install/Resources/Private/Templates/Settings/ExtensionConfigurationGetContent.html new file mode 100644 index 0000000000000000000000000000000000000000..0caa9c9364acbc7c25fc3e9d6560c90e3fbb1da0 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Templates/Settings/ExtensionConfigurationGetContent.html @@ -0,0 +1,22 @@ +<p> + Select extension here +</p> + +<div style="display:none;"> + <div id="t3js-extensionConfiguration-write-token">{extensionConfigurationWriteToken}</div> +</div> + +<div class="t3js-extensionConfiguration-output"></div> + +<div class="form-group"> + <div class="input-group"> + <span class="input-group-addon">Filter by:</span> + <input type="text" class="form-control t3js-extensionConfiguration-search" placeholder="search setting"> + </div> +</div> + +<div class="panel-group" role="tablist" aria-multiselectable="true"> + <f:for each="{extensionsWithConfigurations}" as="extensionData" key="extensionKey"> + <f:render partial="Settings/ExtensionConfiguration/ExtensionForm" arguments="{_all}"/> + </f:for> +</div> diff --git a/typo3/sysext/install/Resources/Public/Css/install.css b/typo3/sysext/install/Resources/Public/Css/install.css index fed178c2ed1b0b8e50c0fd3789598e546d9a994e..d98b7db82ad8f07e249155b0c7c2118a68457e83 100644 --- a/typo3/sysext/install/Resources/Public/Css/install.css +++ b/typo3/sysext/install/Resources/Public/Css/install.css @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -@charset "UTF-8";html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Source Sans Pro';font-weight:200;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-ExtraLight.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-ExtraLight.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-ExtraLight.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-ExtraLight.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-ExtraLight.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:200;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-ExtraLightIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-ExtraLightIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-ExtraLightIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-ExtraLightIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-ExtraLightIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:300;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Light.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Light.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Light.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Light.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Light.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:300;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-LightIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-LightIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-LightIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-LightIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-LightIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:400;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Regular.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Regular.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Regular.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Regular.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Regular.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:400;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-It.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-It.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-It.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-It.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-It.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:600;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Semibold.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Semibold.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Semibold.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Semibold.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Semibold.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:600;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-SemiboldIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-SemiboldIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-SemiboldIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-SemiboldIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-SemiboldIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:700;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Bold.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Bold.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Bold.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Bold.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Bold.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:700;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-BoldIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-BoldIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-BoldIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-BoldIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-BoldIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:900;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Black.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Black.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Black.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Black.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Black.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:900;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-BlackIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-BlackIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-BlackIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-BlackIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-BlackIt.ttf) format("truetype")}@font-face{font-family:FontAwesome;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?v=4.7.0);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff2?v=4.7.0) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff?v=4.7.0) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.ttf?v=4.7.0) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:"ï€"}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:"ï€"}.fa-search-plus:before{content:""}.fa-search-minus:before{content:"ï€"}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:"ï€"}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:"ï€"}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:"ï€"}.fa-map-marker:before{content:"ï"}.fa-adjust:before{content:"ï‚"}.fa-tint:before{content:"ïƒ"}.fa-edit:before,.fa-pencil-square-o:before{content:"ï„"}.fa-share-square-o:before{content:"ï…"}.fa-check-square-o:before{content:"ï†"}.fa-arrows:before{content:"ï‡"}.fa-step-backward:before{content:"ïˆ"}.fa-fast-backward:before{content:"ï‰"}.fa-backward:before{content:"ïŠ"}.fa-play:before{content:"ï‹"}.fa-pause:before{content:"ïŒ"}.fa-stop:before{content:"ï"}.fa-forward:before{content:"ïŽ"}.fa-fast-forward:before{content:"ï"}.fa-step-forward:before{content:"ï‘"}.fa-eject:before{content:"ï’"}.fa-chevron-left:before{content:"ï“"}.fa-chevron-right:before{content:"ï”"}.fa-plus-circle:before{content:"ï•"}.fa-minus-circle:before{content:"ï–"}.fa-times-circle:before{content:"ï—"}.fa-check-circle:before{content:"ï˜"}.fa-question-circle:before{content:"ï™"}.fa-info-circle:before{content:"ïš"}.fa-crosshairs:before{content:"ï›"}.fa-times-circle-o:before{content:"ïœ"}.fa-check-circle-o:before{content:"ï"}.fa-ban:before{content:"ïž"}.fa-arrow-left:before{content:"ï "}.fa-arrow-right:before{content:"ï¡"}.fa-arrow-up:before{content:"ï¢"}.fa-arrow-down:before{content:"ï£"}.fa-mail-forward:before,.fa-share:before{content:"ï¤"}.fa-expand:before{content:"ï¥"}.fa-compress:before{content:"ï¦"}.fa-plus:before{content:"ï§"}.fa-minus:before{content:"ï¨"}.fa-asterisk:before{content:"ï©"}.fa-exclamation-circle:before{content:"ïª"}.fa-gift:before{content:"ï«"}.fa-leaf:before{content:"ï¬"}.fa-fire:before{content:"ï"}.fa-eye:before{content:"ï®"}.fa-eye-slash:before{content:"ï°"}.fa-exclamation-triangle:before,.fa-warning:before{content:"ï±"}.fa-plane:before{content:"ï²"}.fa-calendar:before{content:"ï³"}.fa-random:before{content:"ï´"}.fa-comment:before{content:"ïµ"}.fa-magnet:before{content:"ï¶"}.fa-chevron-up:before{content:"ï·"}.fa-chevron-down:before{content:"ï¸"}.fa-retweet:before{content:"ï¹"}.fa-shopping-cart:before{content:"ïº"}.fa-folder:before{content:"ï»"}.fa-folder-open:before{content:"ï¼"}.fa-arrows-v:before{content:"ï½"}.fa-arrows-h:before{content:"ï¾"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"ï‚€"}.fa-twitter-square:before{content:"ï‚"}.fa-facebook-square:before{content:"ï‚‚"}.fa-camera-retro:before{content:""}.fa-key:before{content:"ï‚„"}.fa-cogs:before,.fa-gears:before{content:"ï‚…"}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:"ï‚Š"}.fa-sign-out:before{content:"ï‚‹"}.fa-linkedin-square:before{content:"ï‚Œ"}.fa-thumb-tack:before{content:"ï‚"}.fa-external-link:before{content:"ï‚Ž"}.fa-sign-in:before{content:"ï‚"}.fa-trophy:before{content:"ï‚‘"}.fa-github-square:before{content:"ï‚’"}.fa-upload:before{content:"ï‚“"}.fa-lemon-o:before{content:"ï‚”"}.fa-phone:before{content:"ï‚•"}.fa-square-o:before{content:"ï‚–"}.fa-bookmark-o:before{content:"ï‚—"}.fa-phone-square:before{content:""}.fa-twitter:before{content:"ï‚™"}.fa-facebook-f:before,.fa-facebook:before{content:"ï‚š"}.fa-github:before{content:"ï‚›"}.fa-unlock:before{content:"ï‚œ"}.fa-credit-card:before{content:"ï‚"}.fa-feed:before,.fa-rss:before{content:"ï‚ž"}.fa-hdd-o:before{content:"ï‚ "}.fa-bullhorn:before{content:"ï‚¡"}.fa-bell:before{content:""}.fa-certificate:before{content:"ï‚£"}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:"ï‚¥"}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:"ï‚©"}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:"ï‚«"}.fa-globe:before{content:""}.fa-wrench:before{content:"ï‚"}.fa-tasks:before{content:"ï‚®"}.fa-filter:before{content:"ï‚°"}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:"ïƒ"}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:"ïƒ"}.fa-table:before{content:""}.fa-magic:before{content:"ïƒ"}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:"ïƒ"}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:"ïƒ "}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:"ïƒ"}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:"ï‚¢"}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:"ï„€"}.fa-angle-double-right:before{content:"ï„"}.fa-angle-double-up:before{content:"ï„‚"}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:"ï„„"}.fa-angle-right:before{content:"ï„…"}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:"ï„Š"}.fa-mobile-phone:before,.fa-mobile:before{content:"ï„‹"}.fa-circle-o:before{content:"ï„Œ"}.fa-quote-left:before{content:"ï„"}.fa-quote-right:before{content:"ï„Ž"}.fa-spinner:before{content:"ï„"}.fa-circle:before{content:"ï„‘"}.fa-mail-reply:before,.fa-reply:before{content:"ï„’"}.fa-github-alt:before{content:"ï„“"}.fa-folder-o:before{content:"ï„”"}.fa-folder-open-o:before{content:"ï„•"}.fa-smile-o:before{content:""}.fa-frown-o:before{content:"ï„™"}.fa-meh-o:before{content:"ï„š"}.fa-gamepad:before{content:"ï„›"}.fa-keyboard-o:before{content:"ï„œ"}.fa-flag-o:before{content:"ï„"}.fa-flag-checkered:before{content:"ï„ž"}.fa-terminal:before{content:"ï„ "}.fa-code:before{content:"ï„¡"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"ï„¢"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"ï„£"}.fa-location-arrow:before{content:""}.fa-crop:before{content:"ï„¥"}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:"ï„©"}.fa-exclamation:before{content:""}.fa-superscript:before{content:"ï„«"}.fa-subscript:before{content:""}.fa-eraser:before{content:"ï„"}.fa-puzzle-piece:before{content:"ï„®"}.fa-microphone:before{content:"ï„°"}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:"ï„´"}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:"ï„·"}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:"ï„»"}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:"ï…€"}.fa-ellipsis-h:before{content:"ï…"}.fa-ellipsis-v:before{content:"ï…‚"}.fa-rss-square:before{content:"ï…ƒ"}.fa-play-circle:before{content:"ï…„"}.fa-ticket:before{content:"ï……"}.fa-minus-square:before{content:"ï…†"}.fa-minus-square-o:before{content:"ï…‡"}.fa-level-up:before{content:"ï…ˆ"}.fa-level-down:before{content:"ï…‰"}.fa-check-square:before{content:"ï…Š"}.fa-pencil-square:before{content:"ï…‹"}.fa-external-link-square:before{content:"ï…Œ"}.fa-share-square:before{content:"ï…"}.fa-compass:before{content:"ï…Ž"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"ï…"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"ï…‘"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"ï…’"}.fa-eur:before,.fa-euro:before{content:"ï…“"}.fa-gbp:before{content:"ï…”"}.fa-dollar:before,.fa-usd:before{content:"ï…•"}.fa-inr:before,.fa-rupee:before{content:"ï…–"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"ï…—"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"ï…˜"}.fa-krw:before,.fa-won:before{content:"ï…™"}.fa-bitcoin:before,.fa-btc:before{content:"ï…š"}.fa-file:before{content:"ï…›"}.fa-file-text:before{content:"ï…œ"}.fa-sort-alpha-asc:before{content:"ï…"}.fa-sort-alpha-desc:before{content:"ï…ž"}.fa-sort-amount-asc:before{content:"ï… "}.fa-sort-amount-desc:before{content:"ï…¡"}.fa-sort-numeric-asc:before{content:"ï…¢"}.fa-sort-numeric-desc:before{content:"ï…£"}.fa-thumbs-up:before{content:"ï…¤"}.fa-thumbs-down:before{content:"ï…¥"}.fa-youtube-square:before{content:"ï…¦"}.fa-youtube:before{content:"ï…§"}.fa-xing:before{content:"ï…¨"}.fa-xing-square:before{content:"ï…©"}.fa-youtube-play:before{content:"ï…ª"}.fa-dropbox:before{content:"ï…«"}.fa-stack-overflow:before{content:"ï…¬"}.fa-instagram:before{content:"ï…"}.fa-flickr:before{content:"ï…®"}.fa-adn:before{content:"ï…°"}.fa-bitbucket:before{content:"ï…±"}.fa-bitbucket-square:before{content:"ï…²"}.fa-tumblr:before{content:"ï…³"}.fa-tumblr-square:before{content:"ï…´"}.fa-long-arrow-down:before{content:"ï…µ"}.fa-long-arrow-up:before{content:"ï…¶"}.fa-long-arrow-left:before{content:"ï…·"}.fa-long-arrow-right:before{content:"ï…¸"}.fa-apple:before{content:"ï…¹"}.fa-windows:before{content:"ï…º"}.fa-android:before{content:"ï…»"}.fa-linux:before{content:"ï…¼"}.fa-dribbble:before{content:"ï…½"}.fa-skype:before{content:"ï…¾"}.fa-foursquare:before{content:""}.fa-trello:before{content:"ï†"}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:"ï†"}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:"ï†"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:"ï†"}.fa-yahoo:before{content:""}.fa-google:before{content:"ï† "}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:"ï†"}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:"ï‡"}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"ï‡"}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"ï‡"}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:"ï‡"}.fa-sliders:before{content:""}.fa-share-alt:before{content:"ï‡ "}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:"ï‡"}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:"ïˆ"}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:"ïˆ"}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:"ïˆ"}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:"ïˆ"}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:"ïˆ"}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"ï‰"}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:"ï‰"}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:"ï‰"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:"ï‰"}.fa-creative-commons:before{content:""}.fa-gg:before{content:"ï‰ "}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:"ï‰"}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:"ïŠ"}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:"ïŠ"}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:"ïŠ"}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:"ïŠ"}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:"ïŠ "}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:"ïŠ"}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:"ï‹€"}.fa-id-badge:before{content:"ï‹"}.fa-drivers-license:before,.fa-id-card:before{content:"ï‹‚"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:"ï‹„"}.fa-free-code-camp:before{content:"ï‹…"}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"ï‹Š"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"ï‹‹"}.fa-shower:before{content:"ï‹Œ"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"ï‹"}.fa-podcast:before{content:"ï‹Ž"}.fa-window-maximize:before{content:"ï‹"}.fa-window-minimize:before{content:"ï‹‘"}.fa-window-restore:before{content:"ï‹’"}.fa-times-rectangle:before,.fa-window-close:before{content:"ï‹“"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"ï‹”"}.fa-bandcamp:before{content:"ï‹•"}.fa-grav:before{content:"ï‹–"}.fa-etsy:before{content:"ï‹—"}.fa-imdb:before{content:""}.fa-ravelry:before{content:"ï‹™"}.fa-eercast:before{content:"ï‹š"}.fa-microchip:before{content:"ï‹›"}.fa-snowflake-o:before{content:"ï‹œ"}.fa-superpowers:before{content:"ï‹"}.fa-wpexplorer:before{content:"ï‹ž"}.fa-meetup:before{content:"ï‹ "}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}*{box-sizing:border-box}:after,:before{box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:1.5;color:#000;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#212424;text-decoration:none}a:focus,a:hover{color:#000;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:2px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #7a7a7a}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#737373}.h1,.h2,.h3,h1,h2,h3{margin-top:18px;margin-bottom:9px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:9px;margin-bottom:9px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:27px}.h2,h2{font-size:19px}.h3,h3{font-size:17px}.h4,h4{font-size:15px}.h5,h5{font-size:12px}.h6,h6{font-size:11px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:13px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:18px}}.small,small{font-size:91%}.mark,mark{background-color:#fbefdd;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.initialism,.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#737373}.text-primary{color:#0078e6}a.text-primary:focus,a.text-primary:hover{color:#005db3}.text-success{color:#79a548}a.text-success:focus,a.text-success:hover{color:#5f8139}.text-info{color:#6daae0}a.text-info:focus,a.text-info:hover{color:#4392d7}.text-warning{color:#e8a33d}a.text-warning:focus,a.text-warning:hover{color:#d88b1a}.text-danger{color:#c83c3c}a.text-danger:focus,a.text-danger:hover{color:#a32e2e}.bg-primary{color:#fff}.bg-primary{background-color:#0078e6}a.bg-primary:focus,a.bg-primary:hover{background-color:#005db3}.bg-success{background-color:#d1e2bd}a.bg-success:focus,a.bg-success:hover{background-color:#b8d39a}.bg-info{background-color:#ebf3fb}a.bg-info:focus,a.bg-info:hover{background-color:#c1dbf2}.bg-warning{background-color:#fbefdd}a.bg-warning:focus,a.bg-warning:hover{background-color:#f6d9af}.bg-danger{background-color:#efc7c7}a.bg-danger:focus,a.bg-danger:hover{background-color:#e49f9f}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #f5f5f5}ol,ul{margin-top:0;margin-bottom:9px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled,.modulemenu .modulemenu-group-container{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dd,dt{line-height:1.5}dt{font-weight:700}dd{margin-left:0}.dl-horizontal dd:after{content:"";display:table;clear:both}@media (min-width:992px){.dl-horizontal dt{float:left;width:70px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:90px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #d7d7d7}.initialism{font-size:90%}blockquote{padding:9px 18px;margin:0 0 18px;font-size:15px;border-left:5px solid #f5f5f5}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.5;color:#d7d7d7}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0;text-align:right}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:18px;font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:2px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:2px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#5a5a5a;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:after{content:"";display:table;clear:both}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container-fluid:after{content:"";display:table;clear:both}.row{margin-left:-15px;margin-right:-15px}.row:after{content:"";display:table;clear:both}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.33333333%}.col-xs-2{width:16.66666667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333%}.col-xs-5{width:41.66666667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333333%}.col-xs-8{width:66.66666667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333%}.col-xs-11{width:91.66666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333333%}.col-xs-push-2{left:16.66666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333333%}.col-xs-push-5{left:41.66666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333333%}.col-xs-push-8{left:66.66666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333333%}.col-xs-push-11{left:91.66666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-12{margin-left:100%}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.33333333%}.col-sm-2{width:16.66666667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333%}.col-sm-5{width:41.66666667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333333%}.col-sm-8{width:66.66666667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333%}.col-sm-11{width:91.66666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333333%}.col-sm-push-2{left:16.66666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333%}.col-sm-push-5{left:41.66666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333333%}.col-sm-push-8{left:66.66666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333%}.col-sm-push-11{left:91.66666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.33333333%}.col-md-2{width:16.66666667%}.col-md-3{width:25%}.col-md-4{width:33.33333333%}.col-md-5{width:41.66666667%}.col-md-6{width:50%}.col-md-7{width:58.33333333%}.col-md-8{width:66.66666667%}.col-md-9{width:75%}.col-md-10{width:83.33333333%}.col-md-11{width:91.66666667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333333%}.col-md-pull-2{right:16.66666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333%}.col-md-pull-5{right:41.66666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333333%}.col-md-pull-8{right:66.66666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333%}.col-md-pull-11{right:91.66666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333333%}.col-md-push-2{left:16.66666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333%}.col-md-push-5{left:41.66666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333333%}.col-md-push-8{left:66.66666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333%}.col-md-push-11{left:91.66666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-12{margin-left:100%}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.33333333%}.col-lg-2{width:16.66666667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333%}.col-lg-5{width:41.66666667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333333%}.col-lg-8{width:66.66666667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333%}.col-lg-11{width:91.66666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333333%}.col-lg-push-2{left:16.66666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333%}.col-lg-push-5{left:41.66666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333333%}.col-lg-push-8{left:66.66666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333%}.col-lg-push-11{left:91.66666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-12{margin-left:100%}}table{background-color:#fafafa}caption{padding-top:6px;padding-bottom:6px;color:#737373;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:18px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:6px;line-height:1.5;vertical-align:top;border-top:1px solid #ccc}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ccc}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ccc}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:6px}.table-bordered{border:1px solid #ccc}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ccc}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f7f7f7}.table-hover>tbody>tr:hover{background-color:#ededed}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#ededed}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e1e0e0}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#d1e2bd}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#c4dbab}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#ebf3fb}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#d6e7f6}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fbefdd}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#f8e4c6}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#efc7c7}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#eab3b3}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ccc}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:18px;line-height:inherit;color:#5a5a5a;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:12px;line-height:1.5;color:#333}.form-control{display:block;width:100%;height:32px;padding:6px 6px;font-size:12px;line-height:1.5;color:#333;background-color:#fefefe;background-image:none;border:1px solid #bbb;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#aaa;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(170,170,170,.6)}.form-control::-moz-placeholder{color:#d7d7d7;opacity:1}.form-control:-ms-input-placeholder{color:#d7d7d7}.form-control::-webkit-input-placeholder{color:#d7d7d7}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f5f5f5;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:32px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],.input-group-sm>.input-group-btn>input[type=date].btn,.input-group-sm>.input-group-btn>input[type=datetime-local].btn,.input-group-sm>.input-group-btn>input[type=month].btn,.input-group-sm>.input-group-btn>input[type=time].btn,.input-group-sm>input[type=date].form-control,.input-group-sm>input[type=date].input-group-addon,.input-group-sm>input[type=datetime-local].form-control,.input-group-sm>input[type=datetime-local].input-group-addon,.input-group-sm>input[type=month].form-control,.input-group-sm>input[type=month].input-group-addon,.input-group-sm>input[type=time].form-control,.input-group-sm>input[type=time].input-group-addon,input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:26px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],.input-group-lg>.input-group-btn>input[type=date].btn,.input-group-lg>.input-group-btn>input[type=datetime-local].btn,.input-group-lg>.input-group-btn>input[type=month].btn,.input-group-lg>.input-group-btn>input[type=time].btn,.input-group-lg>input[type=date].form-control,.input-group-lg>input[type=date].input-group-addon,.input-group-lg>input[type=datetime-local].form-control,.input-group-lg>input[type=datetime-local].input-group-addon,.input-group-lg>input[type=month].form-control,.input-group-lg>input[type=month].input-group-addon,.input-group-lg>input[type=time].form-control,.input-group-lg>input[type=time].input-group-addon,input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:41.2px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:30px}.form-control-static.input-lg,.form-control-static.input-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-left:0;padding-right:0}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-sm{height:26px;padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.input-group-sm>.input-group-btn>select.btn,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,select.input-sm{height:26px;line-height:26px}.input-group-sm>.input-group-btn>select[multiple].btn,.input-group-sm>.input-group-btn>textarea.btn,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:26px;padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.form-group-sm select.form-control{height:26px;line-height:26px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:26px;min-height:29px;padding:5px 4px;font-size:11px;line-height:1.5}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-lg{height:41.2px;padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.input-group-lg>.input-group-btn>select.btn,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,select.input-lg{height:41.2px;line-height:41.2px}.input-group-lg>.input-group-btn>select[multiple].btn,.input-group-lg>.input-group-btn>textarea.btn,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:41.2px;padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.form-group-lg select.form-control{height:41.2px;line-height:41.2px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:41.2px;min-height:33px;padding:13px 12px;font-size:15px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback,.input-lg+.form-control-feedback{width:41.2px;height:41.2px;line-height:41.2px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback,.input-sm+.form-control-feedback{width:26px;height:26px;line-height:26px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#79a548}.has-success .form-control{border-color:#79a548;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#5f8139;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #abcb88}.has-success .input-group-addon{color:#79a548;border-color:#79a548;background-color:#d1e2bd}.has-success .form-control-feedback{color:#79a548}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#e8a33d}.has-warning .form-control{border-color:#e8a33d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#d88b1a;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f3ce98}.has-warning .input-group-addon{color:#e8a33d;border-color:#e8a33d;background-color:#fbefdd}.has-warning .form-control-feedback{color:#e8a33d}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#c83c3c}.has-error .form-control{border-color:#c83c3c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#a32e2e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #de8c8c}.has-error .input-group-addon{color:#c83c3c;border-color:#c83c3c;background-color:#efc7c7}.has-error .form-control-feedback{color:#c83c3c}.has-feedback label~.form-control-feedback{top:23px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#404040}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:after{content:"";display:table;clear:both}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:13px;font-size:15px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:5px;font-size:11px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 6px;font-size:12px;line-height:1.5;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;background-image:none;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#eee;border-color:#bbb}.btn-default.focus,.btn-default:focus{color:#333;background-color:#d5d4d4;border-color:#7b7b7b}.btn-default:hover{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active,.btn-default:active,.open>.btn-default.dropdown-toggle{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.btn-default.dropdown-toggle.focus,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle:hover{color:#333;background-color:#c3c3c3;border-color:#7b7b7b}.btn-default.active,.btn-default:active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#eee;border-color:#bbb}.btn-default .badge{color:#eee;background-color:#333}.btn-primary{color:#fff;background-color:#0078e6;border-color:#006bcd}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#005db3;border-color:#00284d}.btn-primary:hover{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{color:#fff;background-color:#004b8f;border-color:#00284d}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#0078e6;border-color:#006bcd}.btn-primary .badge{color:#0078e6;background-color:#fff}.btn-success{color:#fff;background-color:#79a548;border-color:#6c9340}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#5f8139;border-color:#2b3a1a}.btn-success:hover{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active,.btn-success:active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{color:#fff;background-color:#4d692e;border-color:#2b3a1a}.btn-success.active,.btn-success:active,.open>.btn-success.dropdown-toggle{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#79a548;border-color:#6c9340}.btn-success .badge{color:#79a548;background-color:#fff}.btn-info{color:#fff;background-color:#6daae0;border-color:#589edc}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#4392d7;border-color:#205e94}.btn-info:hover{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active,.btn-info:active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{color:#fff;background-color:#2b80cb;border-color:#205e94}.btn-info.active,.btn-info:active,.open>.btn-info.dropdown-toggle{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#6daae0;border-color:#589edc}.btn-info .badge{color:#6daae0;background-color:#fff}.btn-warning{color:#fff;background-color:#e8a33d;border-color:#e59826}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#d88b1a;border-color:#7d510f}.btn-warning:hover{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active,.btn-warning:active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{color:#fff;background-color:#b87716;border-color:#7d510f}.btn-warning.active,.btn-warning:active,.open>.btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#e8a33d;border-color:#e59826}.btn-warning .badge{color:#e8a33d;background-color:#fff}.btn-danger{color:#fff;background-color:#c83c3c;border-color:#b73434}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#a32e2e;border-color:#531818}.btn-danger:hover{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active,.btn-danger:active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{color:#fff;background-color:#872626;border-color:#531818}.btn-danger.active,.btn-danger:active,.open>.btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c83c3c;border-color:#b73434}.btn-danger .badge{color:#c83c3c;background-color:#fff}.btn-link{color:#212424;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#d7d7d7;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.btn-group-sm>.btn,.btn-sm{padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group-xs>.btn,.btn-xs{padding:2px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:12px;text-align:left;background-color:#292929;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:2px;box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#424242}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.5;color:#fff;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#fff;background-color:#424242}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#424242}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#d7d7d7}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:11px;line-height:1.5;color:#d7d7d7;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:992px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:after{content:"";display:table;clear:both}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{box-shadow:none}.btn .caret{margin-left:0}.btn-group-lg>.btn .caret,.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-group-lg>.btn .caret,.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:after{content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:2px;border-top-left-radius:2px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 6px;font-size:12px;font-weight:400;line-height:1;color:#333;text-align:center;background-color:#f5f5f5;border:1px solid #bbb;border-radius:2px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:4px 4px;font-size:11px;border-radius:2px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:12px 12px;font-size:15px;border-radius:2px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:after{content:"";display:table;clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:6px 12px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#f5f5f5}.nav>li.disabled>a{color:#d7d7d7}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#5a5a5a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#f5f5f5;border-color:#212424}.nav .nav-divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ccc}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.5;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#d7d7d7 #d7d7d7 #ccc}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#000;background-color:#ededed;border:1px solid #ccc;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:2px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#0078e6}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ccc}@media (min-width:768px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ccc;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#ccc}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:2px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 6px;line-height:1.5;text-decoration:none;color:#212424;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#000;background-color:#f5f5f5;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;background-color:#0078e6;border-color:#0078e6;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#d7d7d7;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:12px 12px;font-size:15px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination-sm>li>a,.pagination-sm>li>span{padding:4px 4px;font-size:11px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label:empty{display:none}.btn .label{position:relative;top:-1px}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-default{background-color:#d7d7d7}.label-default[href]:focus,.label-default[href]:hover{background-color:#bebdbd}.label-primary{background-color:#0078e6}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#005db3}.label-success{background-color:#79a548}.label-success[href]:focus,.label-success[href]:hover{background-color:#5f8139}.label-info{background-color:#6daae0}.label-info[href]:focus,.label-info[href]:hover{background-color:#4392d7}.label-warning{background-color:#e8a33d}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#d88b1a}.label-danger{background-color:#c83c3c}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#a32e2e}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:11px;font-weight:700;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#737373;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#212424;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#000}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#212424}.alert{padding:11px;margin-bottom:18px;border:1px solid transparent;border-radius:2px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:31px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#79a548;border-color:transparent;color:#fff}.alert-success hr{border-top-color:transparent}.alert-success .alert-link{color:#e6e5e5}.alert-info{background-color:#6daae0;border-color:transparent;color:#fff}.alert-info hr{border-top-color:transparent}.alert-info .alert-link{color:#e6e5e5}.alert-warning{background-color:#e8a33d;border-color:transparent;color:#fff}.alert-warning hr{border-top-color:transparent}.alert-warning .alert-link{color:#e6e5e5}.alert-danger{background-color:#c83c3c;border-color:transparent;color:#fff}.alert-danger hr{border-top-color:transparent}.alert-danger .alert-link{color:#e6e5e5}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#dedede;border-radius:2px;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:11px;line-height:18px;color:#fff;text-align:center;background-color:#0078e6;box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#79a548}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#6daae0}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#e8a33d}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#c83c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#f5f5f5;color:#d7d7d7;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#d7d7d7}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#0078e6;border-color:#0078e6}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#b3dbff}.list-group-item-success{color:#79a548;background-color:#d1e2bd}a.list-group-item-success,button.list-group-item-success{color:#79a548}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#79a548;background-color:#c4dbab}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#79a548;border-color:#79a548}.list-group-item-info{color:#6daae0;background-color:#ebf3fb}a.list-group-item-info,button.list-group-item-info{color:#6daae0}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#6daae0;background-color:#d6e7f6}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#6daae0;border-color:#6daae0}.list-group-item-warning{color:#e8a33d;background-color:#fbefdd}a.list-group-item-warning,button.list-group-item-warning{color:#e8a33d}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#e8a33d;background-color:#f8e4c6}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.list-group-item-danger{color:#c83c3c;background-color:#efc7c7}a.list-group-item-danger,button.list-group-item-danger{color:#c83c3c}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#c83c3c;background-color:#eab3b3}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:2px;box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-body:after{content:"";display:table;clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:14px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:1px;border-top-right-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ccc}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:2px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ccc}.panel-default>.panel-heading{color:#5a5a5a;background-color:#ddd;border-color:#ccc}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ccc}.panel-default>.panel-heading .badge{color:#ddd;background-color:#5a5a5a}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ccc}.panel-primary{border-color:#0078e6}.panel-primary>.panel-heading{color:#fff;background-color:#0078e6;border-color:#0078e6}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#0078e6}.panel-primary>.panel-heading .badge{color:#0078e6;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#0078e6}.panel-success{border-color:#79a548}.panel-success>.panel-heading{color:#79a548;background-color:#d1e2bd;border-color:#79a548}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-success>.panel-heading .badge{color:#d1e2bd;background-color:#79a548}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-info{border-color:#6daae0}.panel-info>.panel-heading{color:#6daae0;background-color:#ebf3fb;border-color:#6daae0}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-info>.panel-heading .badge{color:#ebf3fb;background-color:#6daae0}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-warning{border-color:#e8a33d}.panel-warning>.panel-heading{color:#e8a33d;background-color:#fbefdd;border-color:#e8a33d}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-warning>.panel-heading .badge{color:#fbefdd;background-color:#e8a33d}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-danger{border-color:#c83c3c}.panel-danger>.panel-heading{color:#c83c3c;background-color:#efc7c7;border-color:#c83c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-danger>.panel-heading .badge{color:#efc7c7;background-color:#c83c3c}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #ccc;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:2px}.well-sm{padding:9px;border-radius:2px}.close{float:right;font-size:18px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:5000;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.in{opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header:after{content:"";display:table;clear:both}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:after{content:"";display:table;clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:Verdana,Arial,Helvetica,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:12px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:1px 1px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.tooltip{position:absolute;z-index:1070;display:block;font-family:Verdana,Arial,Helvetica,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:11px;opacity:0}.tooltip.in{opacity:1}.tooltip.top{margin-top:-3px;padding:3px 0}.tooltip.right{margin-left:3px;padding:0 3px}.tooltip.bottom{margin-top:3px;padding:3px 0}.tooltip.left{margin-left:-3px;padding:0 3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#333;border-radius:2px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.top-left .tooltip-arrow{bottom:0;right:3px;margin-bottom:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.top-right .tooltip-arrow{bottom:0;left:3px;margin-bottom:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-3px;border-width:3px 3px 3px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-3px;border-width:3px 0 3px 3px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-3px;border-width:0 3px 3px;border-bottom-color:#333}.tooltip.bottom-left .tooltip-arrow{top:0;right:3px;margin-top:-3px;border-width:0 3px 3px;border-bottom-color:#333}.tooltip.bottom-right .tooltip-arrow{top:0;left:3px;margin-top:-3px;border-width:0 3px 3px;border-bottom-color:#333}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;max-width:100%;height:auto;line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:transparent}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}html{height:100%;overflow:hidden}body{height:100%;overflow:auto}.scaffold{background-color:#f5f5f5;color:#333;position:relative;padding-top:45px;height:100vh}.scaffold-topbar{background-color:#151515;color:#f5f5f5;height:45px;position:fixed;top:0;right:0;left:0}.scaffold-modulemenu{background-color:#292929;color:#f5f5f5;position:fixed;top:45px;left:0;bottom:0;width:40px;max-width:100%;z-index:1000;overflow:hidden}.scaffold-modulemenu a{color:rgba(245,245,245,.7)}.scaffold-modulemenu a:hover{color:#f5f5f5}.scaffold-modulemenu .active>a{color:#f5f5f5}.scaffold-toolbar{overflow:auto;background-color:#292929;color:#f5f5f5;z-index:1000;position:fixed;top:45px;left:0;right:0;bottom:0;display:none}.scaffold-toolbar .dropdown-menu a,.scaffold-toolbar a{color:rgba(245,245,245,.7)}.scaffold-toolbar .dropdown-menu a:focus,.scaffold-toolbar .dropdown-menu a:hover,.scaffold-toolbar a:focus,.scaffold-toolbar a:hover{color:#f5f5f5}.scaffold-toolbar .active>a{color:#f5f5f5}@media (min-width:992px){.scaffold-toolbar{overflow:visible;background-color:transparent;height:45px;top:0;left:auto;bottom:auto;display:block}}@media (max-width:991px){.scaffold-search-expanded .scaffold-toolbar,.scaffold-toolbar-expanded .scaffold-toolbar{display:block}}.scaffold-content{position:fixed!important;top:45px;left:0;right:0;bottom:0}@media (max-width:991px){.scaffold-content{left:0!important}}.scaffold-content-module-iframe,.scaffold-content-navigation-iframe{display:block;border:none;height:100%;width:100%}.scaffold-content-navigation{display:none;position:absolute!important;left:0;top:0;bottom:0;width:300px}.scaffold-content-navigation-component{position:absolute;top:0;bottom:0;left:0;right:0}.scaffold-content-navigation-component #typo3-pagetree-treeContainer>div>.x-panel-body{overflow:auto}.scaffold-content-module{position:absolute!important;top:0;left:0;bottom:0;right:0}@media (max-width:767px){.scaffold-content-module{width:100%}}.scaffold-content-overlay{display:none;position:absolute;z-index:1040;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.65)}.scaffold-modulemenu-expanded .scaffold-content-overlay{display:block}@media (min-width:992px){.scaffold-modulemenu-expanded .scaffold-content-overlay{display:none}}@media (min-width:992px){.scaffold{padding-left:40px}}.scaffold .scaffold-modulemenu{width:40px}@media (max-width:991px){.scaffold .scaffold-modulemenu{display:none}}.scaffold-modulemenu-expanded{display:block;padding-left:230px}.scaffold-modulemenu-expanded .scaffold-modulemenu{width:230px}@media (max-width:991px){.scaffold-modulemenu-expanded .scaffold-modulemenu{display:block}}.scaffold-modulemenu-expanded .scaffold-content{-webkit-transform:translate(230px,0);transform:translate(230px,0)}.scaffold-content-navigation-expanded .scaffold-content-navigation{display:block}.scaffold-content-navigation-expanded .scaffold-content-module{left:300px}@media (min-width:992px){.scaffold .scaffold-content{left:40px}.scaffold-modulemenu-expanded .scaffold-content{left:230px;-webkit-transform:none;transform:none}}.topbar{background-color:inherit;position:relative;height:45px}.topbar a{color:inherit;text-decoration:none}.topbar-button{position:absolute;top:0;display:inline-block;border:0;background-color:#151515;height:45px;width:40px}.topbar-button:focus,.topbar-button:hover{background-color:#1d1d1d}.topbar-button[disabled],.topbar-button[disabled]:focus,.topbar-button[disabled]:hover{background-color:#292929;cursor:not-allowed;opacity:.5}.topbar-button.topbar-button-modulemenu{left:0}@media (min-width:992px){.topbar-button.topbar-button-modulemenu{background-color:#292929}}.topbar-button.topbar-button-navigationcomponent{left:40px}.topbar-button.topbar-button-toolbar{right:40px}.topbar-button.topbar-button-search{right:0}.scaffold-modulemenu-expanded .topbar-button.topbar-button-modulemenu{background-color:#292929}.scaffold-content-navigation-expanded .topbar-button-navigationcomponent{background-color:#292929}@media (max-width:991px){.scaffold-toolbar-expanded .toolbar-item-search{display:none}}.scaffold-toolbar-expanded .topbar-button-toolbar{background-color:#292929}@media (max-width:991px){.scaffold-search-expanded .toolbar-item{display:none}.scaffold-search-expanded .toolbar-item-search{display:block;width:100%}}.scaffold-search-expanded .topbar-button-search{background-color:#292929}.topbar-button-search,.topbar-button-toolbar{display:block}@media (min-width:992px){.topbar-button-search,.topbar-button-toolbar{display:none}}.topbar-header{padding-left:80px}@media (max-width:991px){.topbar-header{padding-right:80px!important}}.topbar-header-site{overflow:hidden;position:relative;max-width:100%;height:45px;line-height:45px;padding-left:1em;padding-right:1em;white-space:nowrap}.topbar-header-site:after,.topbar-header-site:before{display:block;content:'';position:absolute;top:0;bottom:0;width:1em}.topbar-header-site:before{right:0;background:#151515}.topbar-header-site:after{right:1em;background:-webkit-linear-gradient(left,rgba(21,21,21,0) 0,#151515 100%);background:linear-gradient(to right,rgba(21,21,21,0) 0,#151515 100%)}.typo3-in-workspace .topbar-header-site{background-color:#6d860d}.typo3-in-workspace .topbar-header-site:before{background:#6d860d}.typo3-in-workspace .topbar-header-site:after{background:-webkit-linear-gradient(left,rgba(109,134,13,0) 0,#6d860d 100%);background:linear-gradient(to right,rgba(109,134,13,0) 0,#6d860d 100%)}.topbar-header-site-logo{height:45px;display:none;padding-right:.5em}@media (min-width:320px){.topbar-header-site-logo{display:inline-block}}.topbar-header-site-title{line-height:1.2em;display:inline-block;vertical-align:middle}.topbar-header-site-name{display:block}.topbar-header-site-version{opacity:.5}.toolbar{padding:8px}@media (min-width:992px){.toolbar{padding:0;background-color:#151515}}.toolbar:after{clear:both;display:table;content:''}.toolbar-list{list-style:none;padding:0;margin:0}.toolbar-list:after{clear:both;display:table;content:''}@media (min-width:992px){.toolbar-list li:last-child{width:300px}}.toolbar-item{padding:4px;position:relative;display:block;float:left;width:100%}@media (min-width:600px){.toolbar-item{width:50%}}@media (min-width:750px){.toolbar-item{width:33.33%}}@media (min-width:992px){.toolbar-item{padding:0;width:auto;margin-left:1px}}.toolbar-item .dropdown-menu{width:350px}.toolbar-item .dropdown-menu .text-muted{color:#8c8c8c}.toolbar-item .dropdown-menu a:focus .text-muted,.toolbar-item .dropdown-menu a:hover .text-muted{color:#a6a6a6}@media (max-width:991px){.toolbar-item .dropdown-menu{overflow:auto;padding:15px;position:fixed;max-height:90%;max-width:90%;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.toolbar-item .dropdown-backdrop{background:rgba(0,0,0,.65)}}.toolbar-item-avatar{width:28px;margin-right:2px;display:inline-block}.toolbar-item-avatar .avatar{position:absolute;top:50%;left:10px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.toolbar-item-avatar .avatar,.toolbar-item-avatar .avatar-image{height:28px;width:28px}.toolbar-item-badge{position:absolute;bottom:4px;right:4px;padding:3px 4px;border-radius:0;font-size:10px;font-weight:400;min-width:16px}.toolbar-item-link{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid rgba(0,0,0,.5);position:relative;display:block;text-decoration:none;padding:9px 10px;height:45px;line-height:27px}.toolbar-item-link:focus,.toolbar-item-link:hover{text-decoration:none}@media (min-width:992px){.toolbar-item-link{border:none}}.open .toolbar-item-link{background-color:#292929}@media (min-width:992px){.toolbar-item-title{display:none}}.toolbar-item-search form{padding:0;margin:0}.toolbar-item-search .toolbar-item-link{padding:0;margin:0;height:0}.toolbar-item-search .form-group{margin:0}.toolbar-item-search .close{color:#fff;text-shadow:none;opacity:1}@media (max-width:991px){.toolbar-item-search .dropdown-menu{top:114px;left:14px;right:14px;width:auto;max-width:none;max-height:none;-webkit-transform:none;transform:none;bottom:14px}}@media (min-width:992px){.toolbar-item-search .dropdown-menu{left:auto;right:0}}.toolbar-item-search .autocomplete-suggestions{position:static!important}.toolbar-item-search .autocomplete-suggestion{border:none}.toolbar-item-search.open .toolbar-item-search-form{position:relative;z-index:991}.toolbar-item-search-field{color:inherit;background-color:#2f2f2f;margin:0;border-radius:0;border:1px solid rgba(0,0,0,.5);height:45px;box-shadow:none}@media (min-width:992px){.toolbar-item-search-field{border:none}}.toolbar-item-search-field:hover{background-color:#333}.toolbar-item-search-field:focus{box-shadow:none;background-color:#555}.module-wrapper{position:relative}.module-wrapper iframe{border:none}.modulemenu .modulemenu-group-container{clear:both}.modulemenu .modulemenu-group{position:relative;padding:5px 0;border-bottom:1px solid rgba(0,0,0,.2)}.modulemenu .modulemenu-group-header,.modulemenu .modulemenu-item-link{position:relative;display:block;cursor:pointer;padding:2px 4px;text-decoration:none}.modulemenu .modulemenu-group-header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase}.modulemenu .modulemenu-item-link:focus,.modulemenu .modulemenu-item-link:hover{outline:0;background-color:rgba(0,0,0,.1)}.modulemenu .modulemenu-item.active .modulemenu-item-link{background-color:rgba(0,0,0,.15)}.modulemenu .modulemenu-icon{float:left;margin-right:4px}.modulemenu .modulemenu-icon .fa{font-size:.5em}.modulemenu .modulemenu-group-title,.modulemenu .modulemenu-item-title{white-space:nowrap;text-overflow:ellipsis;padding-top:7px;padding-left:4px;display:none;overflow:hidden}.modulemenu .modulemenu-group-title{padding-right:20px}.modulemenu .modulemenu-group-title .caret{-webkit-transform:rotate(90deg);transform:rotate(90deg);position:absolute;top:17px;right:18px}.modulemenu .expanded .modulemenu-group-title .caret{-webkit-transform:rotate(0);transform:rotate(0)}.scaffold-modulemenu-expanded .modulemenu-group-title,.scaffold-modulemenu-expanded .modulemenu-item-title{display:block}.autocomplete{position:relative}.autocomplete-results{z-index:1000;position:absolute;margin:5px 0;top:100%;left:0;border:1px solid #ddd;border-radius:2px;background-color:#fff;overflow:hidden;box-shadow:0 1px 0 0 rgba(0,0,0,.25)}.autocomplete-suggestion{border-top:1px solid #ddd}.autocomplete-suggestion:first-child{border-top:none}.autocomplete-suggestion-link{padding:5px 13px 5px 28px;display:block;text-decoration:none}.autocomplete-selected .autocomplete-suggestion-link,.autocomplete-suggestion-link:hover{background-color:#fafafa;text-decoration:none}.autocomplete-info{padding:5px 15px}.dropdown-menu{line-height:1.45em;border:0;margin:0;border-radius:0;color:#fff}.dropdown-menu a{color:inherit;display:block}.dropdown-menu a:focus,.dropdown-menu a:hover{color:inherit;text-decoration:none}.dropdown-menu hr{border-top:1px solid rgba(0,0,0,.35);margin:1.25em -15px}.dropdown-menu>:last-child{margin-bottom:0}.dropdown-menu .form-group{margin-bottom:.75em}.dropdown-menu .form-control{border-color:#aaa;color:inherit;border-radius:0;background-color:#333}.dropdown-menu .form-control:focus{box-shadow:none;border-color:#bbb}.dropdown-menu .btn{border:none;border-radius:0;padding:6px 10px}.dropdown-headline{font-size:1.15em;margin-top:0;margin-bottom:.5em}.dropdown-text a{display:inline-block}div.dropdown-menu{padding:1.5em}.dropdown-list{padding-left:0;list-style:none}.dropdown-list>li{position:relative}.dropdown-list>li+li{margin-top:.5em}.dropdown-list-link{display:block;text-decoration:none}.dropdown-list-link:focus,.dropdown-list-link:hover{text-decoration:none}.dropdown-table{display:table;width:100%}.dropdown-table-row{display:table-row}.dropdown-table-column{display:table-cell;padding-top:.25em;padding-bottom:.25em;vertical-align:middle}.dropdown-table-column-top{vertical-align:top}.dropdown-table-icon{width:16px;padding-right:.5em}.dropdown-table-title{white-space:nowrap;padding-right:1.5em}.dropdown-table-title-ellipsis{max-width:230px;overflow:hidden;display:block;white-space:nowrap;text-overflow:ellipsis}.dropdown-table-actions{white-space:nowrap;text-align:right}.dropdown-table-actions-btn{text-align:center;display:inline-block!important;margin-top:-4px;margin-bottom:-4px;padding:4px;vertical-align:middle}.dropdown-table-actions-btn-close:hover,.dropdown-table-actions-btn-edit:hover{background-color:#333}.dropdown-table-actions-btn-delete:hover{background-color:#c83c3c}.avatar{position:relative;display:inline-block;height:32px;width:32px;vertical-align:middle}.avatar-image{display:block;height:32px;width:32px;overflow:hidden;border-radius:50%}.avatar-image:after{display:block;content:'';position:absolute;top:0;left:0;height:100%;width:100%;border-radius:50%;border:1px solid rgba(255,255,255,.1)}.avatar-image>img{display:block;width:100%!important;height:auto!important}.avatar-icon{position:absolute;bottom:0;right:0;height:16px;width:16px}.callout{background-color:#f0f0f0;border-left:3px solid #ccc;margin:20px 0;padding:20px;color:#333}.callout .media{margin:0}.callout .media .fa-stack{color:#fff}.callout .media .fa-stack>.fa:first-child{color:#ccc}.callout .media-body{vertical-align:middle}.callout-icon{margin-top:-2px}.callout-title{font-size:1.3em;margin:0 0 .5em}.callout-body>:last-child{margin-bottom:0}.callout-sm{margin:10px 0;padding:10px}.callout-sm .callout-title{font-size:1em;margin:0}.callout-success{background-color:#d1e2bd;border-color:#79a548;color:#333}.callout-success .media{margin:0}.callout-success .media .fa-stack{color:#fff}.callout-success .media .fa-stack>.fa:first-child{color:#79a548}.callout-info{background-color:#ebf3fb;border-color:#6daae0;color:#333}.callout-info .media{margin:0}.callout-info .media .fa-stack{color:#fff}.callout-info .media .fa-stack>.fa:first-child{color:#6daae0}.callout-warning{background-color:#fbefdd;border-color:#e8a33d;color:#333}.callout-warning .media{margin:0}.callout-warning .media .fa-stack{color:#fff}.callout-warning .media .fa-stack>.fa:first-child{color:#e8a33d}.callout-danger{background-color:#efc7c7;border-color:#c83c3c;color:#333}.callout-danger .media{margin:0}.callout-danger .media .fa-stack{color:#fff}.callout-danger .media .fa-stack>.fa:first-child{color:#c83c3c}.callout-notice{background-color:#f9f9f9;border-color:#a0a0a0;color:#333}.callout-notice .media{margin:0}.callout-notice .media .fa-stack{color:#fff}.callout-notice .media .fa-stack>.fa:first-child{color:#a0a0a0}.icon{position:relative;display:inline-block;overflow:hidden;white-space:nowrap;vertical-align:-22%}.icon img,.icon svg{display:block;height:100%;width:100%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.icon *{display:block;line-height:inherit}.icon-markup{position:absolute;display:block;text-align:center;top:0;left:0;right:0;bottom:0}.icon-overlay{position:absolute;bottom:0;right:0;height:68.75%;width:68.75%;text-align:center}.icon-color{fill:currentColor}.icon-spin .icon-markup{-webkit-animation:icon-spin 2s infinite linear;animation:icon-spin 2s infinite linear}@-webkit-keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.icon-state-disabled .icon-markup{opacity:.5}.icon-size-small{height:16px;width:16px;line-height:16px}.icon-size-small .icon-unify{line-height:16px;font-size:14px}.icon-size-small .icon-overlay .icon-unify{line-height:10px;font-size:9px}.icon-size-default{height:32px;width:32px;line-height:32px}.icon-size-default .icon-unify{line-height:32px;font-size:28px}.icon-size-default .icon-overlay .icon-unify{line-height:20px;font-size:18px}.icon-size-large{height:48px;width:48px;line-height:48px}.icon-size-large .icon-unify{line-height:48px;font-size:42px}.icon-size-large .icon-overlay .icon-unify{line-height:30px;font-size:26px}.icon-actions-edit-copy-release,.icon-actions-edit-cut-release,.icon-status-dialog-error,.icon-status-status-current,.icon-status-status-permission-denied{color:#c83c3c}.icon-status-status-sorting-light-asc,.icon-status-status-sorting-light-desc{color:#fff}.icon-status-status-sorting-asc,.icon-status-status-sorting-desc{color:#737373}.icon-status-dialog-information{color:#6daae0}.icon-status-dialog-ok,.icon-status-status-permission-granted{color:#79a548}.icon-status-dialog-notification{color:#333}.icon-status-dialog-warning{color:#e8a33d}.diff{background-color:#fff;border:1px solid #ccc;display:table}.diff-item{display:table-row}.diff-item+.diff-item{border-top:1px solid #ccc}.diff-item-result,.diff-item-title{padding:10px;display:table-cell}.diff-item-title{background-color:#fafafa;padding-right:10px;font-style:italic;white-space:nowrap}.diff-item-result{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;width:100%;white-space:pre;word-break:break-all;word-wrap:break-word}.diff-item-result del{color:#c80c05;background-color:#fff6f6;text-decoration:none}.diff-item-result ins{color:#44a512;background-color:#ebfce3;text-decoration:none}.diff-item-result.diff-item-result-inline{white-space:normal}.module{min-height:100%;width:100%;background-color:#fff;color:inherit}.module-dark{background-color:#333;color:#ccc}.module-loading-indicator{min-height:5px;width:100%;z-index:999999}.module-loading-indicator.nprogress-custom-parent{position:fixed;top:0}.module-docheader{position:fixed;width:100%;top:0;left:0;min-height:65px;z-index:300;background-color:#eee;border-bottom:1px solid #c3c3c3;padding:0 24px;-webkit-transition:margin-top .3s ease-in-out;transition:margin-top .3s ease-in-out}.module-docheader .module-docheader-bar{min-height:26px;margin:4px 0;line-height:26px}.module-docheader .module-docheader-bar.row{margin-left:-15px;margin-right:-15px}.module-docheader .module-docheader-bar label{margin-top:0;margin-bottom:0}.module-docheader .module-docheader-bar .form-inline .form-group{display:table}.module-docheader .module-docheader-bar .form-inline .form-group label{display:table-cell;font-size:11px;font-weight:400;line-height:16px;padding:4px;border-radius:2px 0 0 2px;border:1px solid #bbb;border-right:0;background-color:rgba(0,0,0,.05)}.module-docheader .module-docheader-bar .form-inline .form-group label+select{display:table-cell;border-top-left-radius:0;border-bottom-left-radius:0}.module-docheader .module-docheader-bar .form-group{vertical-align:top;margin:0;display:inline-block}.module-docheader .module-docheader-bar .form-group .form-control{vertical-align:top}.module-docheader .module-docheader-bar .form-inline-spaced{margin:0}.module-docheader .module-docheader-bar .panel{margin:0;border-left:none;border-right:none;border-bottom:none;border-radius:0;margin-left:-24px;margin-right:-24px;background-color:#fafafa;box-shadow:none}.module-docheader .module-docheader-bar .panel .panel-body{padding:8px 24px}@media (max-width:768px){.module-docheader .module-docheader-bar .text-right{text-align:left}}.module-docheader .module-docheader-bar-search{margin-bottom:0}.module-docheader .module-docheader-bar-column-left{float:left}.module-docheader .module-docheader-bar-column-right{float:right}.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:nowrap}@media (max-width:768px){.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:normal}}.module-docheader-bar-navigation .form-group select{width:100%}.module-body{padding:24px 24px}.module-body>.callout:first-child{margin-top:0}.module-body>.container{padding-left:0;padding-right:0}.module-body .container-small{max-width:768px;margin:0 auto}.module-docheader+.module-body{padding-top:89px}.panel{display:block}.panel:focus,.panel:hover{text-decoration:none}.panel-heading a,.panel-heading a:active,.panel-heading a:focus,.panel-heading a:hover{text-decoration:none;color:inherit}.panel-heading-left{float:left}.panel-heading-right{float:right}.panel-title{font-size:12px}.panel-title-icon,.panel-title-name{display:inline-block;vertical-align:middle}.panel-body>:first-child{margin-top:0}.panel-body>:last-child{margin-bottom:0}.panel-body-highlightlinks>p>a{text-decoration:underline}.panel-table td:first-child,.panel-table th:first-child{padding-left:15px}.panel-table td:last-child,.panel-table th:last-child{padding-right:15px}.panel-progress{background-color:#eee;height:3px;position:relative;width:100%}.panel-progress .panel-progress-bar{display:block;height:100%;background-color:#444}.panel-active{border-color:#444}.panel-active>.panel-heading{color:#fff;background-color:#666;border-color:#444}.panel-active>.panel-heading+.panel-collapse>.panel-body{border-top-color:#444}.panel-active>.panel-heading .badge{color:#666;background-color:#fff}.panel-active>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#444}.clearfix:after,.dropdown-list>li:after,.module-docheader .module-docheader-bar:after,.module-docheader:after,.modulemenu .modulemenu-group-header:after,.modulemenu .modulemenu-item-link:after,.panel-heading:after{content:"";display:table;clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs{display:none!important}.visible-sm{display:none!important}.visible-md{display:none!important}.visible-lg{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container *{box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15);clip:rect(0,0,0,0)}.chosen-container.chosen-with-drop .chosen-drop{clip:auto}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:2px;background-color:#fff;background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;font-size:1em;font-family:sans-serif;line-height:normal}.chosen-container-single .chosen-drop{margin-top:-1px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;clip:rect(0,0,0,0)}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#e8a33d;color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto;border:1px solid #aaa;background-color:#fff;cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:0 0!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;width:25px}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:4px 20px 4px 5px;max-width:100%;background-color:#e8a33d;background-clip:padding-box;color:#fff;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:5px;display:block;width:12px;height:12px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{text-decoration:none}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:after{content:"ï€";font-family:FontAwesome;padding-left:2px;vertical-align:top;color:#fff}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:none;background:0 0}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}.gridder{margin:15px;margin-left:-15px;margin-right:-15px;padding:0;list-style-type:none;font-size:0}.gridder-list,.gridder-show{font-size:12px}.gridder-list{display:inline-block;vertical-align:top;padding-left:15px;padding-right:15px;position:relative}.gridder-list.selectedItem:after{position:absolute;border:15px solid transparent;border-bottom-color:#fff;border-top:0;bottom:0;left:50%;margin-left:-7.5px;content:''}.gridder-list .gridder-item{background-color:#fff;box-shadow:0 2px 0 rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:30px;padding:10px;min-height:200px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform;cursor:pointer;position:relative}.gridder-list .gridder-item:focus,.gridder-list .gridder-item:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 3px 0 rgba(0,0,0,.3)}.gridder-list .gridder-item .label{padding:3px 6px;font-size:12px;vertical-align:top;border-radius:10px;min-width:28px;display:inline-block}.gridder-show{background-color:#fff;display:block;float:left;width:100%;position:relative;margin-bottom:15px}.gridder-show .gridder-padding{padding:30px}.gridder-show .gridder-title{border-bottom:1px solid #ccc;margin-bottom:15px}.gridder-content{display:none}.gridder-list{width:100%}@media (min-width:768px){.gridder-list{width:50%}}@media (min-width:992px){.gridder-list{width:25%}}.card{overflow:hidden;border-radius:2px;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;box-shadow:0 1px 1px rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:20px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform}a.card:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 2px 1px rgba(0,0,0,.3)}.card-container{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:10px -10px}.card-container .card{margin-left:10px;margin-right:10px}.card-size-large,.card-size-medium,.card-size-small{width:calc(100% - 20px)}@media (min-width:768px){.card-size-small{width:calc(50% - 20px)}}@media (min-width:992px){.card-size-small{width:calc(25% - 20px)}}@media (min-width:768px){.card-size-medium{width:calc(50% - 20px)}}@media (min-width:768px){.card-size-large{width:calc(100% - 20px)}}.card-size-fixed-small{width:calc(100% - 20px)}@media (min-width:624px){.card-size-fixed-small{width:calc(50% - 20px)}}@media (min-width:768px){.card-size-fixed-small{width:300px}}.card-content,.card-footer,.card-header,.card-image{padding:1.5em 1.5em 0 1.5em}.card-content:last-child,.card-footer:last-child,.card-header:last-child,.card-image:last-child{padding-bottom:1.5em}.card-content :first-child,.card-footer :first-child,.card-header :first-child,.card-image :first-child{margin-top:0}.card-content :last-child,.card-footer :last-child,.card-header :last-child,.card-image :last-child{margin-bottom:0}.card-image{position:relative;padding-left:0;padding-right:0}.card-image:first-child{padding-top:0}.card-image:first-child .card-image-badge{top:.75em}.card-image:last-child{padding-bottom:0}.card-image .card-image-badge{position:absolute;top:1.5em;right:.75em}.card-image img{display:block;height:auto;width:100%;margin:0 auto}.card-header .card-icon{float:left;margin-right:.75em}.card-header .card-header-body{display:block;overflow:hidden}.card-header .card-title{font-family:inherit;font-weight:500;display:block;font-size:1.35em;line-height:1.2em;margin:0}.card-header .card-subtitle{display:block;margin-top:.5em;font-size:1em;line-height:1.2em;opacity:.5}.card-header .card-longdesc{margin-top:1em}.card-content{height:100%}#typo3-docheader{background:#eee}#typo3-docheader img,#typo3-docheader input{cursor:pointer}#typo3-docheader .t3-icon{margin-bottom:3px}#typo3-docheader .left{float:left}#typo3-docheader .left .t3-icon{margin-right:6px}#typo3-docheader .right{float:right}#typo3-docheader .right .t3-icon{margin-left:6px}#typo3-docheader .buttongroup{float:left;margin-right:6px}#typo3-docheader .buttongroup .c-inputButton{color:inherit;padding:0}#typo3-docheader .buttongroup input.c-inputButton{text-indent:-1000px}#typo3-docheader select{margin-right:12px}#typo3-docheader a{color:#2d2d2d}#typo3-docheader a:hover{color:#000}#typo3-docheader a.active{color:#c3c3c3}#typo3-docheader a.active span{cursor:default}#typo3-docheader .typo3-docheader-buttons,#typo3-docheader .typo3-docheader-functions{color:#2d2d2d;overflow:hidden;padding:0 24px}#typo3-docheader .typo3-docheader-functions{height:27px;line-height:27px}#typo3-docheader .typo3-docheader-functions select{color:#2d2d2d}#typo3-docheader .typo3-docheader-buttons{height:22px;padding-top:3px;padding-bottom:3px;border-bottom:1px solid #c3c3c3}.alert-notice{background-color:#333;border-color:transparent;color:#fff}.alert-notice hr{border-top-color:transparent}.alert-notice .alert-link{color:#e6e5e5}.alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);border:0}.alert a{color:inherit;text-decoration:underline}.alert .media{margin:0}.alert .media .fa-stack>.fa:first-child{opacity:.2}.alert .media-body{vertical-align:middle}.alert-title{font-size:1.12em;font-weight:700;margin:0 0 .25em}.alert-body,.alert-message{margin:0;font-size:.9em}.alert-body>:last-child,.alert-message>:last-child{margin-bottom:0}.alert-body>ul,.alert-message>ul{padding-left:1.5em}.alert-dismissible .close{opacity:.5;padding:1px;top:-3px;right:-22px;color:inherit}.alert-dismissible .close:hover{opacity:1;color:inherit}#alert-container{width:400px;position:absolute;right:5px;top:46px;z-index:10000}#alert-container .alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1),0 2px 0 0 rgba(0,0,0,.15);position:relative;margin:5px auto}#alert-container .alert.fade.in{opacity:.95}body.backend .module{background:#f5f5f5}.content-area{padding-bottom:35px}.content-area>h3{margin-top:0}.content-area>:last-child{margin-bottom:0}.logo-pageheader img{padding-bottom:3px}img.logo{vertical-align:bottom}.typo3-message>h4{margin-bottom:0}.typo3-message p{margin-top:9px}.t3-install-displaytwinimageimages{border:1px solid #ccc;padding:10px}.t3-install-displaytwinimagetextarea pre{border-top:0}.bg-transparent-emulation{padding:10px;text-align:center;background:url(../../../../../../typo3/sysext/install/Resources/Public/Images/bg_transparent_emulation.png)}.bg-transparent-emulation img{max-width:300px}.alert-notice{background-color:#eee;border-color:#bbb;color:#333}.alert-notice hr{border-top-color:#aeaeae}.alert-notice .alert-link{color:#1a1919}.nav-pills>li>a{border-radius:0}h1:first-child{margin-top:0}.typo3-docheader-buttons,.typo3-docheader-functions{min-height:20px}.item{margin:1em;border:1px solid #ddd}.item .item-heading{padding:1em;background-color:#ddd}.item .item-body{padding:1em}.list-group-item a{display:block}.list-group-item.active a{color:#fff}.caret{border:0;padding-left:10px}.caret:after{position:relative;top:-8px;left:-10px;content:"";font-family:FontAwesome}.collapsed .caret:after{content:"";font-family:FontAwesome}.panel-heading{position:relative}.panel-heading .panel-checkbox{margin:0;position:absolute;left:1em;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.panel-heading .panel-checkbox+.panel-title{padding-left:18px}.panel-heading .message{display:block;padding-left:16px;margin-top:5px}a[data-toggle=collapse]{display:block}@media (min-width:992px){.affix-bottom{position:absolute}body.standalone .affix-top{position:relative}.affix{position:fixed;top:35px}body.backend .affix-top{position:fixed;top:35px}body.backend .leftNavigation{min-height:425px}}hr{border-top-color:#ddd}.copyright .panel-default:last-child{margin-bottom:0}#fixed-footer-handler{height:32px}.fixed{position:fixed;bottom:0;background-color:grey}.fixed .footer-innerWrap{padding:1.5em}@media (max-width:991px){#menuWrapper{position:relative!important;margin-bottom:30px}}#mobileMenuWrapper{margin-bottom:10px}#install-menu-button{float:right;margin-bottom:20px}#install-menu-button .navbar-toggle{border:0;background:#fff}#install-menu-button .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px;background-color:#000}#install-menu-button .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.form-control-clearable{position:relative}.form-control-clearable .form-control{padding-right:2.3em}.form-control-clearable .close{position:absolute;height:16px;z-index:3;top:50%;right:.5em;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.form-control-clearable .close .icon{vertical-align:0}.input-group .form-control-clearable{display:table-cell}.input-group .form-control-clearable .form-control{display:block}a[data-toggle=collapse]{text-decoration:none}.panel-group-flat .panel-body,.panel-group-rst .panel-body{padding-right:0}.panel-flat,.panel-rst,.panel-version{border:0;border-left:2px solid #d7d7d7;border-radius:0;margin:0}.panel-flat.panel-default .panel-heading,.panel-rst.panel-default .panel-heading,.panel-version.panel-default .panel-heading{background:#f5f5f5}.panel-flat.panel-breaking,.panel-flat.panel-danger,.panel-rst.panel-breaking,.panel-rst.panel-danger,.panel-version.panel-breaking,.panel-version.panel-danger{border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading,.panel-flat.panel-danger>.panel-heading,.panel-rst.panel-breaking>.panel-heading,.panel-rst.panel-danger>.panel-heading,.panel-version.panel-breaking>.panel-heading,.panel-version.panel-danger>.panel-heading{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading .badge,.panel-flat.panel-danger>.panel-heading .badge,.panel-rst.panel-breaking>.panel-heading .badge,.panel-rst.panel-danger>.panel-heading .badge,.panel-version.panel-breaking>.panel-heading .badge,.panel-version.panel-danger>.panel-heading .badge{color:#c83c3c;background-color:#fff}.panel-flat.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.panel-flat.panel-breaking.risk-high>.panel-heading,.panel-flat.panel-danger.risk-high>.panel-heading,.panel-rst.panel-breaking.risk-high>.panel-heading,.panel-rst.panel-danger.risk-high>.panel-heading,.panel-version.panel-breaking.risk-high>.panel-heading,.panel-version.panel-danger.risk-high>.panel-heading{background:#c83c3c;color:#f5f5f5}.panel-flat.panel-breaking.risk-medium>.panel-heading,.panel-flat.panel-danger.risk-medium>.panel-heading,.panel-rst.panel-breaking.risk-medium>.panel-heading,.panel-rst.panel-danger.risk-medium>.panel-heading,.panel-version.panel-breaking.risk-medium>.panel-heading,.panel-version.panel-danger.risk-medium>.panel-heading{background:#f5dbdb;color:#1e1e1e}.panel-flat.panel-breaking.risk-low>.panel-heading,.panel-flat.panel-danger.risk-low>.panel-heading,.panel-rst.panel-breaking.risk-low>.panel-heading,.panel-rst.panel-danger.risk-low>.panel-heading,.panel-version.panel-breaking.risk-low>.panel-heading,.panel-version.panel-danger.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-breaking .panel-progress .panel-progress-bar,.panel-flat.panel-danger .panel-progress .panel-progress-bar,.panel-rst.panel-breaking .panel-progress .panel-progress-bar,.panel-rst.panel-danger .panel-progress .panel-progress-bar,.panel-version.panel-breaking .panel-progress .panel-progress-bar,.panel-version.panel-danger .panel-progress .panel-progress-bar{background-color:#c83c3c}.panel-flat.panel-deprecation,.panel-flat.panel-warning,.panel-rst.panel-deprecation,.panel-rst.panel-warning,.panel-version.panel-deprecation,.panel-version.panel-warning{border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading,.panel-flat.panel-warning>.panel-heading,.panel-rst.panel-deprecation>.panel-heading,.panel-rst.panel-warning>.panel-heading,.panel-version.panel-deprecation>.panel-heading,.panel-version.panel-warning>.panel-heading{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading .badge,.panel-flat.panel-warning>.panel-heading .badge,.panel-rst.panel-deprecation>.panel-heading .badge,.panel-rst.panel-warning>.panel-heading .badge,.panel-version.panel-deprecation>.panel-heading .badge,.panel-version.panel-warning>.panel-heading .badge{color:#e8a33d;background-color:#fff}.panel-flat.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-flat.panel-deprecation.risk-high>.panel-heading,.panel-flat.panel-warning.risk-high>.panel-heading,.panel-rst.panel-deprecation.risk-high>.panel-heading,.panel-rst.panel-warning.risk-high>.panel-heading,.panel-version.panel-deprecation.risk-high>.panel-heading,.panel-version.panel-warning.risk-high>.panel-heading{background:#e8a33d;color:#f5f5f5}.panel-flat.panel-deprecation.risk-medium>.panel-heading,.panel-flat.panel-warning.risk-medium>.panel-heading,.panel-rst.panel-deprecation.risk-medium>.panel-heading,.panel-rst.panel-warning.risk-medium>.panel-heading,.panel-version.panel-deprecation.risk-medium>.panel-heading,.panel-version.panel-warning.risk-medium>.panel-heading{background:#f8e4c6;color:#1e1e1e}.panel-flat.panel-deprecation.risk-low>.panel-heading,.panel-flat.panel-warning.risk-low>.panel-heading,.panel-rst.panel-deprecation.risk-low>.panel-heading,.panel-rst.panel-warning.risk-low>.panel-heading,.panel-version.panel-deprecation.risk-low>.panel-heading,.panel-version.panel-warning.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-deprecation .panel-progress .panel-progress-bar,.panel-flat.panel-warning .panel-progress .panel-progress-bar,.panel-rst.panel-deprecation .panel-progress .panel-progress-bar,.panel-rst.panel-warning .panel-progress .panel-progress-bar,.panel-version.panel-deprecation .panel-progress .panel-progress-bar,.panel-version.panel-warning .panel-progress .panel-progress-bar{background-color:#e8a33d}.panel-flat.panel-feature,.panel-flat.panel-success,.panel-rst.panel-feature,.panel-rst.panel-success,.panel-version.panel-feature,.panel-version.panel-success{border-color:#79a548}.panel-flat.panel-feature>.panel-heading,.panel-flat.panel-success>.panel-heading,.panel-rst.panel-feature>.panel-heading,.panel-rst.panel-success>.panel-heading,.panel-version.panel-feature>.panel-heading,.panel-version.panel-success>.panel-heading{color:#fff;background-color:#79a548;border-color:#79a548}.panel-flat.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-flat.panel-feature>.panel-heading .badge,.panel-flat.panel-success>.panel-heading .badge,.panel-rst.panel-feature>.panel-heading .badge,.panel-rst.panel-success>.panel-heading .badge,.panel-version.panel-feature>.panel-heading .badge,.panel-version.panel-success>.panel-heading .badge{color:#79a548;background-color:#fff}.panel-flat.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-flat.panel-feature.risk-high>.panel-heading,.panel-flat.panel-success.risk-high>.panel-heading,.panel-rst.panel-feature.risk-high>.panel-heading,.panel-rst.panel-success.risk-high>.panel-heading,.panel-version.panel-feature.risk-high>.panel-heading,.panel-version.panel-success.risk-high>.panel-heading{background:#79a548;color:#f5f5f5}.panel-flat.panel-feature.risk-medium>.panel-heading,.panel-flat.panel-success.risk-medium>.panel-heading,.panel-rst.panel-feature.risk-medium>.panel-heading,.panel-rst.panel-success.risk-medium>.panel-heading,.panel-version.panel-feature.risk-medium>.panel-heading,.panel-version.panel-success.risk-medium>.panel-heading{background:#ddeacf;color:#1e1e1e}.panel-flat.panel-feature.risk-low>.panel-heading,.panel-flat.panel-success.risk-low>.panel-heading,.panel-rst.panel-feature.risk-low>.panel-heading,.panel-rst.panel-success.risk-low>.panel-heading,.panel-version.panel-feature.risk-low>.panel-heading,.panel-version.panel-success.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-feature .panel-progress .panel-progress-bar,.panel-flat.panel-success .panel-progress .panel-progress-bar,.panel-rst.panel-feature .panel-progress .panel-progress-bar,.panel-rst.panel-success .panel-progress .panel-progress-bar,.panel-version.panel-feature .panel-progress .panel-progress-bar,.panel-version.panel-success .panel-progress .panel-progress-bar{background-color:#79a548}.panel-flat.panel-important,.panel-flat.panel-info,.panel-rst.panel-important,.panel-rst.panel-info,.panel-version.panel-important,.panel-version.panel-info{border-color:#6daae0}.panel-flat.panel-important>.panel-heading,.panel-flat.panel-info>.panel-heading,.panel-rst.panel-important>.panel-heading,.panel-rst.panel-info>.panel-heading,.panel-version.panel-important>.panel-heading,.panel-version.panel-info>.panel-heading{color:#fff;background-color:#6daae0;border-color:#6daae0}.panel-flat.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-flat.panel-important>.panel-heading .badge,.panel-flat.panel-info>.panel-heading .badge,.panel-rst.panel-important>.panel-heading .badge,.panel-rst.panel-info>.panel-heading .badge,.panel-version.panel-important>.panel-heading .badge,.panel-version.panel-info>.panel-heading .badge{color:#6daae0;background-color:#fff}.panel-flat.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-flat.panel-important.risk-high>.panel-heading,.panel-flat.panel-info.risk-high>.panel-heading,.panel-rst.panel-important.risk-high>.panel-heading,.panel-rst.panel-info.risk-high>.panel-heading,.panel-version.panel-important.risk-high>.panel-heading,.panel-version.panel-info.risk-high>.panel-heading{background:#6daae0;color:#f5f5f5}.panel-flat.panel-important.risk-medium>.panel-heading,.panel-flat.panel-info.risk-medium>.panel-heading,.panel-rst.panel-important.risk-medium>.panel-heading,.panel-rst.panel-info.risk-medium>.panel-heading,.panel-version.panel-important.risk-medium>.panel-heading,.panel-version.panel-info.risk-medium>.panel-heading{background:#ebf3fb;color:#1e1e1e}.panel-flat.panel-important.risk-low>.panel-heading,.panel-flat.panel-info.risk-low>.panel-heading,.panel-rst.panel-important.risk-low>.panel-heading,.panel-rst.panel-info.risk-low>.panel-heading,.panel-version.panel-important.risk-low>.panel-heading,.panel-version.panel-info.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-important .panel-progress .panel-progress-bar,.panel-flat.panel-info .panel-progress .panel-progress-bar,.panel-rst.panel-important .panel-progress .panel-progress-bar,.panel-rst.panel-info .panel-progress .panel-progress-bar,.panel-version.panel-important .panel-progress .panel-progress-bar,.panel-version.panel-info .panel-progress .panel-progress-bar{background-color:#6daae0}.panel-flat .panel-heading,.panel-rst .panel-heading,.panel-version .panel-heading{position:relative}.panel-flat .panel-heading a.link-action,.panel-rst .panel-heading a.link-action,.panel-version .panel-heading a.link-action{cursor:pointer}.panel-flat .panel-heading strong,.panel-rst .panel-heading strong,.panel-version .panel-heading strong{line-height:1.5em}.panel-flat pre,.panel-rst pre,.panel-version pre{margin:0;border-radius:0;border:0;border-top:1px solid #d7d7d7;white-space:pre-wrap;word-break:normal;word-wrap:normal}.upgrade_analysis_item_to_filter pre a{text-decoration:underline}#phpinfo table{width:100%;table-layout:fixed;word-wrap:break-word} \ No newline at end of file +@charset "UTF-8";html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Source Sans Pro';font-weight:200;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-ExtraLight.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-ExtraLight.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-ExtraLight.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-ExtraLight.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-ExtraLight.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:200;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-ExtraLightIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-ExtraLightIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-ExtraLightIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-ExtraLightIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-ExtraLightIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:300;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Light.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Light.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Light.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Light.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Light.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:300;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-LightIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-LightIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-LightIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-LightIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-LightIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:400;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Regular.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Regular.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Regular.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Regular.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Regular.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:400;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-It.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-It.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-It.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-It.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-It.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:600;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Semibold.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Semibold.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Semibold.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Semibold.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Semibold.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:600;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-SemiboldIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-SemiboldIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-SemiboldIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-SemiboldIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-SemiboldIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:700;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Bold.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Bold.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Bold.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Bold.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Bold.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:700;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-BoldIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-BoldIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-BoldIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-BoldIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-BoldIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:900;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Black.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Black.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Black.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Black.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Black.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:900;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-BlackIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-BlackIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-BlackIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-BlackIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-BlackIt.ttf) format("truetype")}@font-face{font-family:FontAwesome;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?v=4.7.0);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff2?v=4.7.0) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff?v=4.7.0) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.ttf?v=4.7.0) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:"ï€"}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:"ï€"}.fa-search-plus:before{content:""}.fa-search-minus:before{content:"ï€"}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:"ï€"}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:"ï€"}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:"ï€"}.fa-map-marker:before{content:"ï"}.fa-adjust:before{content:"ï‚"}.fa-tint:before{content:"ïƒ"}.fa-edit:before,.fa-pencil-square-o:before{content:"ï„"}.fa-share-square-o:before{content:"ï…"}.fa-check-square-o:before{content:"ï†"}.fa-arrows:before{content:"ï‡"}.fa-step-backward:before{content:"ïˆ"}.fa-fast-backward:before{content:"ï‰"}.fa-backward:before{content:"ïŠ"}.fa-play:before{content:"ï‹"}.fa-pause:before{content:"ïŒ"}.fa-stop:before{content:"ï"}.fa-forward:before{content:"ïŽ"}.fa-fast-forward:before{content:"ï"}.fa-step-forward:before{content:"ï‘"}.fa-eject:before{content:"ï’"}.fa-chevron-left:before{content:"ï“"}.fa-chevron-right:before{content:"ï”"}.fa-plus-circle:before{content:"ï•"}.fa-minus-circle:before{content:"ï–"}.fa-times-circle:before{content:"ï—"}.fa-check-circle:before{content:"ï˜"}.fa-question-circle:before{content:"ï™"}.fa-info-circle:before{content:"ïš"}.fa-crosshairs:before{content:"ï›"}.fa-times-circle-o:before{content:"ïœ"}.fa-check-circle-o:before{content:"ï"}.fa-ban:before{content:"ïž"}.fa-arrow-left:before{content:"ï "}.fa-arrow-right:before{content:"ï¡"}.fa-arrow-up:before{content:"ï¢"}.fa-arrow-down:before{content:"ï£"}.fa-mail-forward:before,.fa-share:before{content:"ï¤"}.fa-expand:before{content:"ï¥"}.fa-compress:before{content:"ï¦"}.fa-plus:before{content:"ï§"}.fa-minus:before{content:"ï¨"}.fa-asterisk:before{content:"ï©"}.fa-exclamation-circle:before{content:"ïª"}.fa-gift:before{content:"ï«"}.fa-leaf:before{content:"ï¬"}.fa-fire:before{content:"ï"}.fa-eye:before{content:"ï®"}.fa-eye-slash:before{content:"ï°"}.fa-exclamation-triangle:before,.fa-warning:before{content:"ï±"}.fa-plane:before{content:"ï²"}.fa-calendar:before{content:"ï³"}.fa-random:before{content:"ï´"}.fa-comment:before{content:"ïµ"}.fa-magnet:before{content:"ï¶"}.fa-chevron-up:before{content:"ï·"}.fa-chevron-down:before{content:"ï¸"}.fa-retweet:before{content:"ï¹"}.fa-shopping-cart:before{content:"ïº"}.fa-folder:before{content:"ï»"}.fa-folder-open:before{content:"ï¼"}.fa-arrows-v:before{content:"ï½"}.fa-arrows-h:before{content:"ï¾"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"ï‚€"}.fa-twitter-square:before{content:"ï‚"}.fa-facebook-square:before{content:"ï‚‚"}.fa-camera-retro:before{content:""}.fa-key:before{content:"ï‚„"}.fa-cogs:before,.fa-gears:before{content:"ï‚…"}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:"ï‚Š"}.fa-sign-out:before{content:"ï‚‹"}.fa-linkedin-square:before{content:"ï‚Œ"}.fa-thumb-tack:before{content:"ï‚"}.fa-external-link:before{content:"ï‚Ž"}.fa-sign-in:before{content:"ï‚"}.fa-trophy:before{content:"ï‚‘"}.fa-github-square:before{content:"ï‚’"}.fa-upload:before{content:"ï‚“"}.fa-lemon-o:before{content:"ï‚”"}.fa-phone:before{content:"ï‚•"}.fa-square-o:before{content:"ï‚–"}.fa-bookmark-o:before{content:"ï‚—"}.fa-phone-square:before{content:""}.fa-twitter:before{content:"ï‚™"}.fa-facebook-f:before,.fa-facebook:before{content:"ï‚š"}.fa-github:before{content:"ï‚›"}.fa-unlock:before{content:"ï‚œ"}.fa-credit-card:before{content:"ï‚"}.fa-feed:before,.fa-rss:before{content:"ï‚ž"}.fa-hdd-o:before{content:"ï‚ "}.fa-bullhorn:before{content:"ï‚¡"}.fa-bell:before{content:""}.fa-certificate:before{content:"ï‚£"}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:"ï‚¥"}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:"ï‚©"}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:"ï‚«"}.fa-globe:before{content:""}.fa-wrench:before{content:"ï‚"}.fa-tasks:before{content:"ï‚®"}.fa-filter:before{content:"ï‚°"}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:"ïƒ"}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:"ïƒ"}.fa-table:before{content:""}.fa-magic:before{content:"ïƒ"}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:"ïƒ"}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:"ïƒ "}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:"ïƒ"}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:"ï‚¢"}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:"ï„€"}.fa-angle-double-right:before{content:"ï„"}.fa-angle-double-up:before{content:"ï„‚"}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:"ï„„"}.fa-angle-right:before{content:"ï„…"}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:"ï„Š"}.fa-mobile-phone:before,.fa-mobile:before{content:"ï„‹"}.fa-circle-o:before{content:"ï„Œ"}.fa-quote-left:before{content:"ï„"}.fa-quote-right:before{content:"ï„Ž"}.fa-spinner:before{content:"ï„"}.fa-circle:before{content:"ï„‘"}.fa-mail-reply:before,.fa-reply:before{content:"ï„’"}.fa-github-alt:before{content:"ï„“"}.fa-folder-o:before{content:"ï„”"}.fa-folder-open-o:before{content:"ï„•"}.fa-smile-o:before{content:""}.fa-frown-o:before{content:"ï„™"}.fa-meh-o:before{content:"ï„š"}.fa-gamepad:before{content:"ï„›"}.fa-keyboard-o:before{content:"ï„œ"}.fa-flag-o:before{content:"ï„"}.fa-flag-checkered:before{content:"ï„ž"}.fa-terminal:before{content:"ï„ "}.fa-code:before{content:"ï„¡"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"ï„¢"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"ï„£"}.fa-location-arrow:before{content:""}.fa-crop:before{content:"ï„¥"}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:"ï„©"}.fa-exclamation:before{content:""}.fa-superscript:before{content:"ï„«"}.fa-subscript:before{content:""}.fa-eraser:before{content:"ï„"}.fa-puzzle-piece:before{content:"ï„®"}.fa-microphone:before{content:"ï„°"}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:"ï„´"}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:"ï„·"}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:"ï„»"}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:"ï…€"}.fa-ellipsis-h:before{content:"ï…"}.fa-ellipsis-v:before{content:"ï…‚"}.fa-rss-square:before{content:"ï…ƒ"}.fa-play-circle:before{content:"ï…„"}.fa-ticket:before{content:"ï……"}.fa-minus-square:before{content:"ï…†"}.fa-minus-square-o:before{content:"ï…‡"}.fa-level-up:before{content:"ï…ˆ"}.fa-level-down:before{content:"ï…‰"}.fa-check-square:before{content:"ï…Š"}.fa-pencil-square:before{content:"ï…‹"}.fa-external-link-square:before{content:"ï…Œ"}.fa-share-square:before{content:"ï…"}.fa-compass:before{content:"ï…Ž"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"ï…"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"ï…‘"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"ï…’"}.fa-eur:before,.fa-euro:before{content:"ï…“"}.fa-gbp:before{content:"ï…”"}.fa-dollar:before,.fa-usd:before{content:"ï…•"}.fa-inr:before,.fa-rupee:before{content:"ï…–"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"ï…—"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"ï…˜"}.fa-krw:before,.fa-won:before{content:"ï…™"}.fa-bitcoin:before,.fa-btc:before{content:"ï…š"}.fa-file:before{content:"ï…›"}.fa-file-text:before{content:"ï…œ"}.fa-sort-alpha-asc:before{content:"ï…"}.fa-sort-alpha-desc:before{content:"ï…ž"}.fa-sort-amount-asc:before{content:"ï… "}.fa-sort-amount-desc:before{content:"ï…¡"}.fa-sort-numeric-asc:before{content:"ï…¢"}.fa-sort-numeric-desc:before{content:"ï…£"}.fa-thumbs-up:before{content:"ï…¤"}.fa-thumbs-down:before{content:"ï…¥"}.fa-youtube-square:before{content:"ï…¦"}.fa-youtube:before{content:"ï…§"}.fa-xing:before{content:"ï…¨"}.fa-xing-square:before{content:"ï…©"}.fa-youtube-play:before{content:"ï…ª"}.fa-dropbox:before{content:"ï…«"}.fa-stack-overflow:before{content:"ï…¬"}.fa-instagram:before{content:"ï…"}.fa-flickr:before{content:"ï…®"}.fa-adn:before{content:"ï…°"}.fa-bitbucket:before{content:"ï…±"}.fa-bitbucket-square:before{content:"ï…²"}.fa-tumblr:before{content:"ï…³"}.fa-tumblr-square:before{content:"ï…´"}.fa-long-arrow-down:before{content:"ï…µ"}.fa-long-arrow-up:before{content:"ï…¶"}.fa-long-arrow-left:before{content:"ï…·"}.fa-long-arrow-right:before{content:"ï…¸"}.fa-apple:before{content:"ï…¹"}.fa-windows:before{content:"ï…º"}.fa-android:before{content:"ï…»"}.fa-linux:before{content:"ï…¼"}.fa-dribbble:before{content:"ï…½"}.fa-skype:before{content:"ï…¾"}.fa-foursquare:before{content:""}.fa-trello:before{content:"ï†"}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:"ï†"}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:"ï†"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:"ï†"}.fa-yahoo:before{content:""}.fa-google:before{content:"ï† "}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:"ï†"}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:"ï‡"}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"ï‡"}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"ï‡"}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:"ï‡"}.fa-sliders:before{content:""}.fa-share-alt:before{content:"ï‡ "}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:"ï‡"}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:"ïˆ"}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:"ïˆ"}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:"ïˆ"}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:"ïˆ"}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:"ïˆ"}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"ï‰"}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:"ï‰"}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:"ï‰"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:"ï‰"}.fa-creative-commons:before{content:""}.fa-gg:before{content:"ï‰ "}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:"ï‰"}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:"ïŠ"}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:"ïŠ"}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:"ïŠ"}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:"ïŠ"}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:"ïŠ "}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:"ïŠ"}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:"ï‹€"}.fa-id-badge:before{content:"ï‹"}.fa-drivers-license:before,.fa-id-card:before{content:"ï‹‚"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:"ï‹„"}.fa-free-code-camp:before{content:"ï‹…"}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"ï‹Š"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"ï‹‹"}.fa-shower:before{content:"ï‹Œ"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"ï‹"}.fa-podcast:before{content:"ï‹Ž"}.fa-window-maximize:before{content:"ï‹"}.fa-window-minimize:before{content:"ï‹‘"}.fa-window-restore:before{content:"ï‹’"}.fa-times-rectangle:before,.fa-window-close:before{content:"ï‹“"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"ï‹”"}.fa-bandcamp:before{content:"ï‹•"}.fa-grav:before{content:"ï‹–"}.fa-etsy:before{content:"ï‹—"}.fa-imdb:before{content:""}.fa-ravelry:before{content:"ï‹™"}.fa-eercast:before{content:"ï‹š"}.fa-microchip:before{content:"ï‹›"}.fa-snowflake-o:before{content:"ï‹œ"}.fa-superpowers:before{content:"ï‹"}.fa-wpexplorer:before{content:"ï‹ž"}.fa-meetup:before{content:"ï‹ "}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}*{box-sizing:border-box}:after,:before{box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:1.5;color:#000;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#212424;text-decoration:none}a:focus,a:hover{color:#000;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:2px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #7a7a7a}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#737373}.h1,.h2,.h3,h1,h2,h3{margin-top:18px;margin-bottom:9px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:9px;margin-bottom:9px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:27px}.h2,h2{font-size:19px}.h3,h3{font-size:17px}.h4,h4{font-size:15px}.h5,h5{font-size:12px}.h6,h6{font-size:11px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:13px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:18px}}.small,small{font-size:91%}.mark,mark{background-color:#fbefdd;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.initialism,.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#737373}.text-primary{color:#0078e6}a.text-primary:focus,a.text-primary:hover{color:#005db3}.text-success{color:#79a548}a.text-success:focus,a.text-success:hover{color:#5f8139}.text-info{color:#6daae0}a.text-info:focus,a.text-info:hover{color:#4392d7}.text-warning{color:#e8a33d}a.text-warning:focus,a.text-warning:hover{color:#d88b1a}.text-danger{color:#c83c3c}a.text-danger:focus,a.text-danger:hover{color:#a32e2e}.bg-primary{color:#fff}.bg-primary{background-color:#0078e6}a.bg-primary:focus,a.bg-primary:hover{background-color:#005db3}.bg-success{background-color:#d1e2bd}a.bg-success:focus,a.bg-success:hover{background-color:#b8d39a}.bg-info{background-color:#ebf3fb}a.bg-info:focus,a.bg-info:hover{background-color:#c1dbf2}.bg-warning{background-color:#fbefdd}a.bg-warning:focus,a.bg-warning:hover{background-color:#f6d9af}.bg-danger{background-color:#efc7c7}a.bg-danger:focus,a.bg-danger:hover{background-color:#e49f9f}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #f5f5f5}ol,ul{margin-top:0;margin-bottom:9px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled,.modulemenu .modulemenu-group-container{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dd,dt{line-height:1.5}dt{font-weight:700}dd{margin-left:0}.dl-horizontal dd:after,.form-irre-header-body dl dd:after{content:"";display:table;clear:both}@media (min-width:992px){.dl-horizontal dt,.form-irre-header-body dl dt{float:left;width:70px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd,.form-irre-header-body dl dd{margin-left:90px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #d7d7d7}.initialism{font-size:90%}blockquote{padding:9px 18px;margin:0 0 18px;font-size:15px;border-left:5px solid #f5f5f5}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.5;color:#d7d7d7}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0;text-align:right}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:18px;font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:2px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:2px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#5a5a5a;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:after{content:"";display:table;clear:both}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container-fluid:after{content:"";display:table;clear:both}.row{margin-left:-15px;margin-right:-15px}.row:after{content:"";display:table;clear:both}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.33333333%}.col-xs-2{width:16.66666667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333%}.col-xs-5{width:41.66666667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333333%}.col-xs-8{width:66.66666667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333%}.col-xs-11{width:91.66666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333333%}.col-xs-push-2{left:16.66666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333333%}.col-xs-push-5{left:41.66666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333333%}.col-xs-push-8{left:66.66666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333333%}.col-xs-push-11{left:91.66666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-12{margin-left:100%}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.33333333%}.col-sm-2{width:16.66666667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333%}.col-sm-5{width:41.66666667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333333%}.col-sm-8{width:66.66666667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333%}.col-sm-11{width:91.66666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333333%}.col-sm-push-2{left:16.66666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333%}.col-sm-push-5{left:41.66666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333333%}.col-sm-push-8{left:66.66666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333%}.col-sm-push-11{left:91.66666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.33333333%}.col-md-2{width:16.66666667%}.col-md-3{width:25%}.col-md-4{width:33.33333333%}.col-md-5{width:41.66666667%}.col-md-6{width:50%}.col-md-7{width:58.33333333%}.col-md-8{width:66.66666667%}.col-md-9{width:75%}.col-md-10{width:83.33333333%}.col-md-11{width:91.66666667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333333%}.col-md-pull-2{right:16.66666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333%}.col-md-pull-5{right:41.66666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333333%}.col-md-pull-8{right:66.66666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333%}.col-md-pull-11{right:91.66666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333333%}.col-md-push-2{left:16.66666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333%}.col-md-push-5{left:41.66666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333333%}.col-md-push-8{left:66.66666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333%}.col-md-push-11{left:91.66666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-12{margin-left:100%}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.33333333%}.col-lg-2{width:16.66666667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333%}.col-lg-5{width:41.66666667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333333%}.col-lg-8{width:66.66666667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333%}.col-lg-11{width:91.66666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333333%}.col-lg-push-2{left:16.66666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333%}.col-lg-push-5{left:41.66666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333333%}.col-lg-push-8{left:66.66666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333%}.col-lg-push-11{left:91.66666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-12{margin-left:100%}}table{background-color:#fafafa}caption{padding-top:6px;padding-bottom:6px;color:#737373;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:18px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:6px;line-height:1.5;vertical-align:top;border-top:1px solid #ccc}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ccc}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ccc}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:6px}.table-bordered{border:1px solid #ccc}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ccc}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f7f7f7}.table-hover>tbody>tr:hover{background-color:#ededed}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#ededed}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e1e0e0}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#d1e2bd}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#c4dbab}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#ebf3fb}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#d6e7f6}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fbefdd}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#f8e4c6}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#efc7c7}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#eab3b3}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ccc}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:18px;line-height:inherit;color:#5a5a5a;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:12px;line-height:1.5;color:#333}.form-control{display:block;width:100%;height:32px;padding:6px 6px;font-size:12px;line-height:1.5;color:#333;background-color:#fefefe;background-image:none;border:1px solid #bbb;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#aaa;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(170,170,170,.6)}.form-control::-moz-placeholder{color:#d7d7d7;opacity:1}.form-control:-ms-input-placeholder{color:#d7d7d7}.form-control::-webkit-input-placeholder{color:#d7d7d7}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f5f5f5;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:32px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],.input-group-sm>.input-group-btn>input[type=date].btn,.input-group-sm>.input-group-btn>input[type=datetime-local].btn,.input-group-sm>.input-group-btn>input[type=month].btn,.input-group-sm>.input-group-btn>input[type=time].btn,.input-group-sm>input[type=date].form-control,.input-group-sm>input[type=date].input-group-addon,.input-group-sm>input[type=datetime-local].form-control,.input-group-sm>input[type=datetime-local].input-group-addon,.input-group-sm>input[type=month].form-control,.input-group-sm>input[type=month].input-group-addon,.input-group-sm>input[type=time].form-control,.input-group-sm>input[type=time].input-group-addon,input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:26px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],.input-group-lg>.input-group-btn>input[type=date].btn,.input-group-lg>.input-group-btn>input[type=datetime-local].btn,.input-group-lg>.input-group-btn>input[type=month].btn,.input-group-lg>.input-group-btn>input[type=time].btn,.input-group-lg>input[type=date].form-control,.input-group-lg>input[type=date].input-group-addon,.input-group-lg>input[type=datetime-local].form-control,.input-group-lg>input[type=datetime-local].input-group-addon,.input-group-lg>input[type=month].form-control,.input-group-lg>input[type=month].input-group-addon,.input-group-lg>input[type=time].form-control,.input-group-lg>input[type=time].input-group-addon,input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:41.2px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:30px}.form-control-static.input-lg,.form-control-static.input-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-left:0;padding-right:0}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-sm{height:26px;padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.input-group-sm>.input-group-btn>select.btn,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,select.input-sm{height:26px;line-height:26px}.input-group-sm>.input-group-btn>select[multiple].btn,.input-group-sm>.input-group-btn>textarea.btn,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:26px;padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.form-group-sm select.form-control{height:26px;line-height:26px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:26px;min-height:29px;padding:5px 4px;font-size:11px;line-height:1.5}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-lg{height:41.2px;padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.input-group-lg>.input-group-btn>select.btn,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,select.input-lg{height:41.2px;line-height:41.2px}.input-group-lg>.input-group-btn>select[multiple].btn,.input-group-lg>.input-group-btn>textarea.btn,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:41.2px;padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.form-group-lg select.form-control{height:41.2px;line-height:41.2px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:41.2px;min-height:33px;padding:13px 12px;font-size:15px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback,.input-lg+.form-control-feedback{width:41.2px;height:41.2px;line-height:41.2px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback,.input-sm+.form-control-feedback{width:26px;height:26px;line-height:26px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#79a548}.has-success .form-control{border-color:#79a548;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#5f8139;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #abcb88}.has-success .input-group-addon{color:#79a548;border-color:#79a548;background-color:#d1e2bd}.has-success .form-control-feedback{color:#79a548}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#e8a33d}.has-warning .form-control{border-color:#e8a33d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#d88b1a;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f3ce98}.has-warning .input-group-addon{color:#e8a33d;border-color:#e8a33d;background-color:#fbefdd}.has-warning .form-control-feedback{color:#e8a33d}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#c83c3c}.has-error .form-control{border-color:#c83c3c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#a32e2e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #de8c8c}.has-error .input-group-addon{color:#c83c3c;border-color:#c83c3c;background-color:#efc7c7}.has-error .form-control-feedback{color:#c83c3c}.has-feedback label~.form-control-feedback{top:23px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#404040}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:after{content:"";display:table;clear:both}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:13px;font-size:15px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:5px;font-size:11px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 6px;font-size:12px;line-height:1.5;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;background-image:none;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#eee;border-color:#bbb}.btn-default.focus,.btn-default:focus{color:#333;background-color:#d5d4d4;border-color:#7b7b7b}.btn-default:hover{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active,.btn-default:active,.open>.btn-default.dropdown-toggle{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.btn-default.dropdown-toggle.focus,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle:hover{color:#333;background-color:#c3c3c3;border-color:#7b7b7b}.btn-default.active,.btn-default:active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#eee;border-color:#bbb}.btn-default .badge{color:#eee;background-color:#333}.btn-primary{color:#fff;background-color:#0078e6;border-color:#006bcd}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#005db3;border-color:#00284d}.btn-primary:hover{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{color:#fff;background-color:#004b8f;border-color:#00284d}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#0078e6;border-color:#006bcd}.btn-primary .badge{color:#0078e6;background-color:#fff}.btn-success{color:#fff;background-color:#79a548;border-color:#6c9340}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#5f8139;border-color:#2b3a1a}.btn-success:hover{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active,.btn-success:active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{color:#fff;background-color:#4d692e;border-color:#2b3a1a}.btn-success.active,.btn-success:active,.open>.btn-success.dropdown-toggle{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#79a548;border-color:#6c9340}.btn-success .badge{color:#79a548;background-color:#fff}.btn-info{color:#fff;background-color:#6daae0;border-color:#589edc}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#4392d7;border-color:#205e94}.btn-info:hover{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active,.btn-info:active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{color:#fff;background-color:#2b80cb;border-color:#205e94}.btn-info.active,.btn-info:active,.open>.btn-info.dropdown-toggle{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#6daae0;border-color:#589edc}.btn-info .badge{color:#6daae0;background-color:#fff}.btn-warning{color:#fff;background-color:#e8a33d;border-color:#e59826}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#d88b1a;border-color:#7d510f}.btn-warning:hover{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active,.btn-warning:active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{color:#fff;background-color:#b87716;border-color:#7d510f}.btn-warning.active,.btn-warning:active,.open>.btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#e8a33d;border-color:#e59826}.btn-warning .badge{color:#e8a33d;background-color:#fff}.btn-danger{color:#fff;background-color:#c83c3c;border-color:#b73434}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#a32e2e;border-color:#531818}.btn-danger:hover{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active,.btn-danger:active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{color:#fff;background-color:#872626;border-color:#531818}.btn-danger.active,.btn-danger:active,.open>.btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c83c3c;border-color:#b73434}.btn-danger .badge{color:#c83c3c;background-color:#fff}.btn-link{color:#212424;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#d7d7d7;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.btn-group-sm>.btn,.btn-sm{padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group-xs>.btn,.btn-xs{padding:2px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:12px;text-align:left;background-color:#292929;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:2px;box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#424242}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.5;color:#fff;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#fff;background-color:#424242}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#424242}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#d7d7d7}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:11px;line-height:1.5;color:#d7d7d7;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:992px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:after{content:"";display:table;clear:both}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{box-shadow:none}.btn .caret{margin-left:0}.btn-group-lg>.btn .caret,.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-group-lg>.btn .caret,.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:after{content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:2px;border-top-left-radius:2px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 6px;font-size:12px;font-weight:400;line-height:1;color:#333;text-align:center;background-color:#f5f5f5;border:1px solid #bbb;border-radius:2px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:4px 4px;font-size:11px;border-radius:2px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:12px 12px;font-size:15px;border-radius:2px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:after{content:"";display:table;clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:6px 12px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#f5f5f5}.nav>li.disabled>a{color:#d7d7d7}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#5a5a5a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#f5f5f5;border-color:#212424}.nav .nav-divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ccc}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.5;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#d7d7d7 #d7d7d7 #ccc}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#000;background-color:#ededed;border:1px solid #ccc;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:2px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#0078e6}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ccc}@media (min-width:768px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ccc;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#ccc}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:2px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 6px;line-height:1.5;text-decoration:none;color:#212424;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#000;background-color:#f5f5f5;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;background-color:#0078e6;border-color:#0078e6;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#d7d7d7;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:12px 12px;font-size:15px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination-sm>li>a,.pagination-sm>li>span{padding:4px 4px;font-size:11px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label:empty{display:none}.btn .label{position:relative;top:-1px}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-default{background-color:#d7d7d7}.label-default[href]:focus,.label-default[href]:hover{background-color:#bebdbd}.label-primary{background-color:#0078e6}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#005db3}.label-success{background-color:#79a548}.label-success[href]:focus,.label-success[href]:hover{background-color:#5f8139}.label-info{background-color:#6daae0}.label-info[href]:focus,.label-info[href]:hover{background-color:#4392d7}.label-warning{background-color:#e8a33d}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#d88b1a}.label-danger{background-color:#c83c3c}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#a32e2e}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:11px;font-weight:700;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#737373;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#212424;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#000}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#212424}.alert{padding:11px;margin-bottom:18px;border:1px solid transparent;border-radius:2px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:31px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#79a548;border-color:transparent;color:#fff}.alert-success hr{border-top-color:transparent}.alert-success .alert-link{color:#e6e5e5}.alert-info{background-color:#6daae0;border-color:transparent;color:#fff}.alert-info hr{border-top-color:transparent}.alert-info .alert-link{color:#e6e5e5}.alert-warning{background-color:#e8a33d;border-color:transparent;color:#fff}.alert-warning hr{border-top-color:transparent}.alert-warning .alert-link{color:#e6e5e5}.alert-danger{background-color:#c83c3c;border-color:transparent;color:#fff}.alert-danger hr{border-top-color:transparent}.alert-danger .alert-link{color:#e6e5e5}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#dedede;border-radius:2px;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:11px;line-height:18px;color:#fff;text-align:center;background-color:#0078e6;box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#79a548}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#6daae0}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#e8a33d}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#c83c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#f5f5f5;color:#d7d7d7;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#d7d7d7}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#0078e6;border-color:#0078e6}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#b3dbff}.list-group-item-success{color:#79a548;background-color:#d1e2bd}a.list-group-item-success,button.list-group-item-success{color:#79a548}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#79a548;background-color:#c4dbab}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#79a548;border-color:#79a548}.list-group-item-info{color:#6daae0;background-color:#ebf3fb}a.list-group-item-info,button.list-group-item-info{color:#6daae0}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#6daae0;background-color:#d6e7f6}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#6daae0;border-color:#6daae0}.list-group-item-warning{color:#e8a33d;background-color:#fbefdd}a.list-group-item-warning,button.list-group-item-warning{color:#e8a33d}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#e8a33d;background-color:#f8e4c6}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.list-group-item-danger{color:#c83c3c;background-color:#efc7c7}a.list-group-item-danger,button.list-group-item-danger{color:#c83c3c}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#c83c3c;background-color:#eab3b3}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:2px;box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-body:after{content:"";display:table;clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:14px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:1px;border-top-right-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ccc}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:2px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ccc}.panel-default>.panel-heading{color:#5a5a5a;background-color:#ddd;border-color:#ccc}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ccc}.panel-default>.panel-heading .badge{color:#ddd;background-color:#5a5a5a}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ccc}.panel-primary{border-color:#0078e6}.panel-primary>.panel-heading{color:#fff;background-color:#0078e6;border-color:#0078e6}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#0078e6}.panel-primary>.panel-heading .badge{color:#0078e6;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#0078e6}.panel-success{border-color:#79a548}.panel-success>.panel-heading{color:#79a548;background-color:#d1e2bd;border-color:#79a548}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-success>.panel-heading .badge{color:#d1e2bd;background-color:#79a548}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-info{border-color:#6daae0}.panel-info>.panel-heading{color:#6daae0;background-color:#ebf3fb;border-color:#6daae0}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-info>.panel-heading .badge{color:#ebf3fb;background-color:#6daae0}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-warning{border-color:#e8a33d}.panel-warning>.panel-heading{color:#e8a33d;background-color:#fbefdd;border-color:#e8a33d}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-warning>.panel-heading .badge{color:#fbefdd;background-color:#e8a33d}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-danger{border-color:#c83c3c}.panel-danger>.panel-heading{color:#c83c3c;background-color:#efc7c7;border-color:#c83c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-danger>.panel-heading .badge{color:#efc7c7;background-color:#c83c3c}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #ccc;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:2px}.well-sm{padding:9px;border-radius:2px}.close{float:right;font-size:18px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:5000;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.in{opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header:after{content:"";display:table;clear:both}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:after{content:"";display:table;clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:Verdana,Arial,Helvetica,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:12px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:1px 1px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.tooltip{position:absolute;z-index:1070;display:block;font-family:Verdana,Arial,Helvetica,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:11px;opacity:0}.tooltip.in{opacity:1}.tooltip.top{margin-top:-3px;padding:3px 0}.tooltip.right{margin-left:3px;padding:0 3px}.tooltip.bottom{margin-top:3px;padding:3px 0}.tooltip.left{margin-left:-3px;padding:0 3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#333;border-radius:2px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.top-left .tooltip-arrow{bottom:0;right:3px;margin-bottom:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.top-right .tooltip-arrow{bottom:0;left:3px;margin-bottom:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-3px;border-width:3px 3px 3px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-3px;border-width:3px 0 3px 3px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-3px;border-width:0 3px 3px;border-bottom-color:#333}.tooltip.bottom-left .tooltip-arrow{top:0;right:3px;margin-top:-3px;border-width:0 3px 3px;border-bottom-color:#333}.tooltip.bottom-right .tooltip-arrow{top:0;left:3px;margin-top:-3px;border-width:0 3px 3px;border-bottom-color:#333}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;max-width:100%;height:auto;line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:transparent}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}html{height:100%;overflow:hidden}body{height:100%;overflow:auto}.scaffold{background-color:#f5f5f5;color:#333;position:relative;padding-top:45px;height:100vh}.scaffold-topbar{background-color:#151515;color:#f5f5f5;height:45px;position:fixed;top:0;right:0;left:0}.scaffold-modulemenu{background-color:#292929;color:#f5f5f5;position:fixed;top:45px;left:0;bottom:0;width:40px;max-width:100%;z-index:1000;overflow:hidden}.scaffold-modulemenu a{color:rgba(245,245,245,.7)}.scaffold-modulemenu a:hover{color:#f5f5f5}.scaffold-modulemenu .active>a{color:#f5f5f5}.scaffold-toolbar{overflow:auto;background-color:#292929;color:#f5f5f5;z-index:1000;position:fixed;top:45px;left:0;right:0;bottom:0;display:none}.scaffold-toolbar .dropdown-menu a,.scaffold-toolbar a{color:rgba(245,245,245,.7)}.scaffold-toolbar .dropdown-menu a:focus,.scaffold-toolbar .dropdown-menu a:hover,.scaffold-toolbar a:focus,.scaffold-toolbar a:hover{color:#f5f5f5}.scaffold-toolbar .active>a{color:#f5f5f5}@media (min-width:992px){.scaffold-toolbar{overflow:visible;background-color:transparent;height:45px;top:0;left:auto;bottom:auto;display:block}}@media (max-width:991px){.scaffold-search-expanded .scaffold-toolbar,.scaffold-toolbar-expanded .scaffold-toolbar{display:block}}.scaffold-content{position:fixed!important;top:45px;left:0;right:0;bottom:0}@media (max-width:991px){.scaffold-content{left:0!important}}.scaffold-content-module-iframe,.scaffold-content-navigation-iframe{display:block;border:none;height:100%;width:100%}.scaffold-content-navigation{display:none;position:absolute!important;left:0;top:0;bottom:0;width:300px}.scaffold-content-navigation-component{position:absolute;top:0;bottom:0;left:0;right:0}.scaffold-content-navigation-component #typo3-pagetree-treeContainer>div>.x-panel-body{overflow:auto}.scaffold-content-module{position:absolute!important;top:0;left:0;bottom:0;right:0}@media (max-width:767px){.scaffold-content-module{width:100%}}.scaffold-content-overlay{display:none;position:absolute;z-index:1040;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.65)}.scaffold-modulemenu-expanded .scaffold-content-overlay{display:block}@media (min-width:992px){.scaffold-modulemenu-expanded .scaffold-content-overlay{display:none}}@media (min-width:992px){.scaffold{padding-left:40px}}.scaffold .scaffold-modulemenu{width:40px}@media (max-width:991px){.scaffold .scaffold-modulemenu{display:none}}.scaffold-modulemenu-expanded{display:block;padding-left:230px}.scaffold-modulemenu-expanded .scaffold-modulemenu{width:230px}@media (max-width:991px){.scaffold-modulemenu-expanded .scaffold-modulemenu{display:block}}.scaffold-modulemenu-expanded .scaffold-content{-webkit-transform:translate(230px,0);transform:translate(230px,0)}.scaffold-content-navigation-expanded .scaffold-content-navigation{display:block}.scaffold-content-navigation-expanded .scaffold-content-module{left:300px}@media (min-width:992px){.scaffold .scaffold-content{left:40px}.scaffold-modulemenu-expanded .scaffold-content{left:230px;-webkit-transform:none;transform:none}}.topbar{background-color:inherit;position:relative;height:45px}.topbar a{color:inherit;text-decoration:none}.topbar-button{position:absolute;top:0;display:inline-block;border:0;background-color:#151515;height:45px;width:40px}.topbar-button:focus,.topbar-button:hover{background-color:#1d1d1d}.topbar-button[disabled],.topbar-button[disabled]:focus,.topbar-button[disabled]:hover{background-color:#292929;cursor:not-allowed;opacity:.5}.topbar-button.topbar-button-modulemenu{left:0}@media (min-width:992px){.topbar-button.topbar-button-modulemenu{background-color:#292929}}.topbar-button.topbar-button-navigationcomponent{left:40px}.topbar-button.topbar-button-toolbar{right:40px}.topbar-button.topbar-button-search{right:0}.scaffold-modulemenu-expanded .topbar-button.topbar-button-modulemenu{background-color:#292929}.scaffold-content-navigation-expanded .topbar-button-navigationcomponent{background-color:#292929}@media (max-width:991px){.scaffold-toolbar-expanded .toolbar-item-search{display:none}}.scaffold-toolbar-expanded .topbar-button-toolbar{background-color:#292929}@media (max-width:991px){.scaffold-search-expanded .toolbar-item{display:none}.scaffold-search-expanded .toolbar-item-search{display:block;width:100%}}.scaffold-search-expanded .topbar-button-search{background-color:#292929}.topbar-button-search,.topbar-button-toolbar{display:block}@media (min-width:992px){.topbar-button-search,.topbar-button-toolbar{display:none}}.topbar-header{padding-left:80px}@media (max-width:991px){.topbar-header{padding-right:80px!important}}.topbar-header-site{overflow:hidden;position:relative;max-width:100%;height:45px;line-height:45px;padding-left:1em;padding-right:1em;white-space:nowrap}.topbar-header-site:after,.topbar-header-site:before{display:block;content:'';position:absolute;top:0;bottom:0;width:1em}.topbar-header-site:before{right:0;background:#151515}.topbar-header-site:after{right:1em;background:-webkit-linear-gradient(left,rgba(21,21,21,0) 0,#151515 100%);background:linear-gradient(to right,rgba(21,21,21,0) 0,#151515 100%)}.typo3-in-workspace .topbar-header-site{background-color:#6d860d}.typo3-in-workspace .topbar-header-site:before{background:#6d860d}.typo3-in-workspace .topbar-header-site:after{background:-webkit-linear-gradient(left,rgba(109,134,13,0) 0,#6d860d 100%);background:linear-gradient(to right,rgba(109,134,13,0) 0,#6d860d 100%)}.topbar-header-site-logo{height:45px;display:none;padding-right:.5em}@media (min-width:320px){.topbar-header-site-logo{display:inline-block}}.topbar-header-site-title{line-height:1.2em;display:inline-block;vertical-align:middle}.topbar-header-site-name{display:block}.topbar-header-site-version{opacity:.5}.toolbar{padding:8px}@media (min-width:992px){.toolbar{padding:0;background-color:#151515}}.toolbar:after{clear:both;display:table;content:''}.toolbar-list{list-style:none;padding:0;margin:0}.toolbar-list:after{clear:both;display:table;content:''}@media (min-width:992px){.toolbar-list li:last-child{width:300px}}.toolbar-item{padding:4px;position:relative;display:block;float:left;width:100%}@media (min-width:600px){.toolbar-item{width:50%}}@media (min-width:750px){.toolbar-item{width:33.33%}}@media (min-width:992px){.toolbar-item{padding:0;width:auto;margin-left:1px}}.toolbar-item .dropdown-menu{width:350px}.toolbar-item .dropdown-menu .text-muted{color:#8c8c8c}.toolbar-item .dropdown-menu a:focus .text-muted,.toolbar-item .dropdown-menu a:hover .text-muted{color:#a6a6a6}@media (max-width:991px){.toolbar-item .dropdown-menu{overflow:auto;padding:15px;position:fixed;max-height:90%;max-width:90%;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.toolbar-item .dropdown-backdrop{background:rgba(0,0,0,.65)}}.toolbar-item-avatar{width:28px;margin-right:2px;display:inline-block}.toolbar-item-avatar .avatar{position:absolute;top:50%;left:10px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.toolbar-item-avatar .avatar,.toolbar-item-avatar .avatar-image{height:28px;width:28px}.toolbar-item-badge{position:absolute;bottom:4px;right:4px;padding:3px 4px;border-radius:0;font-size:10px;font-weight:400;min-width:16px}.toolbar-item-link{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid rgba(0,0,0,.5);position:relative;display:block;text-decoration:none;padding:9px 10px;height:45px;line-height:27px}.toolbar-item-link:focus,.toolbar-item-link:hover{text-decoration:none}@media (min-width:992px){.toolbar-item-link{border:none}}.open .toolbar-item-link{background-color:#292929}@media (min-width:992px){.toolbar-item-title{display:none}}.toolbar-item-search form{padding:0;margin:0}.toolbar-item-search .toolbar-item-link{padding:0;margin:0;height:0}.toolbar-item-search .form-group{margin:0}.toolbar-item-search .close{color:#fff;text-shadow:none;opacity:1}@media (max-width:991px){.toolbar-item-search .dropdown-menu{top:114px;left:14px;right:14px;width:auto;max-width:none;max-height:none;-webkit-transform:none;transform:none;bottom:14px}}@media (min-width:992px){.toolbar-item-search .dropdown-menu{left:auto;right:0}}.toolbar-item-search .autocomplete-suggestions{position:static!important}.toolbar-item-search .autocomplete-suggestion{border:none}.toolbar-item-search.open .toolbar-item-search-form{position:relative;z-index:991}.toolbar-item-search-field{color:inherit;background-color:#2f2f2f;margin:0;border-radius:0;border:1px solid rgba(0,0,0,.5);height:45px;box-shadow:none}@media (min-width:992px){.toolbar-item-search-field{border:none}}.toolbar-item-search-field:hover{background-color:#333}.toolbar-item-search-field:focus{box-shadow:none;background-color:#555}.module-wrapper{position:relative}.module-wrapper iframe{border:none}.modulemenu .modulemenu-group-container{clear:both}.modulemenu .modulemenu-group{position:relative;padding:5px 0;border-bottom:1px solid rgba(0,0,0,.2)}.modulemenu .modulemenu-group-header,.modulemenu .modulemenu-item-link{position:relative;display:block;cursor:pointer;padding:2px 4px;text-decoration:none}.modulemenu .modulemenu-group-header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase}.modulemenu .modulemenu-item-link:focus,.modulemenu .modulemenu-item-link:hover{outline:0;background-color:rgba(0,0,0,.1)}.modulemenu .modulemenu-item.active .modulemenu-item-link{background-color:rgba(0,0,0,.15)}.modulemenu .modulemenu-icon{float:left;margin-right:4px}.modulemenu .modulemenu-icon .fa{font-size:.5em}.modulemenu .modulemenu-group-title,.modulemenu .modulemenu-item-title{white-space:nowrap;text-overflow:ellipsis;padding-top:7px;padding-left:4px;display:none;overflow:hidden}.modulemenu .modulemenu-group-title{padding-right:20px}.modulemenu .modulemenu-group-title .caret{-webkit-transform:rotate(90deg);transform:rotate(90deg);position:absolute;top:17px;right:18px}.modulemenu .expanded .modulemenu-group-title .caret{-webkit-transform:rotate(0);transform:rotate(0)}.scaffold-modulemenu-expanded .modulemenu-group-title,.scaffold-modulemenu-expanded .modulemenu-item-title{display:block}.autocomplete{position:relative}.autocomplete-results{z-index:1000;position:absolute;margin:5px 0;top:100%;left:0;border:1px solid #ddd;border-radius:2px;background-color:#fff;overflow:hidden;box-shadow:0 1px 0 0 rgba(0,0,0,.25)}.autocomplete-suggestion{border-top:1px solid #ddd}.autocomplete-suggestion:first-child{border-top:none}.autocomplete-suggestion-link{padding:5px 13px 5px 28px;display:block;text-decoration:none}.autocomplete-selected .autocomplete-suggestion-link,.autocomplete-suggestion-link:hover{background-color:#fafafa;text-decoration:none}.autocomplete-info{padding:5px 15px}.dropdown-menu{line-height:1.45em;border:0;margin:0;border-radius:0;color:#fff}.dropdown-menu a{color:inherit;display:block}.dropdown-menu a:focus,.dropdown-menu a:hover{color:inherit;text-decoration:none}.dropdown-menu hr{border-top:1px solid rgba(0,0,0,.35);margin:1.25em -15px}.dropdown-menu>:last-child{margin-bottom:0}.dropdown-menu .form-group{margin-bottom:.75em}.dropdown-menu .form-control{border-color:#aaa;color:inherit;border-radius:0;background-color:#333}.dropdown-menu .form-control:focus{box-shadow:none;border-color:#bbb}.dropdown-menu .btn{border:none;border-radius:0;padding:6px 10px}.dropdown-headline{font-size:1.15em;margin-top:0;margin-bottom:.5em}.dropdown-text a{display:inline-block}div.dropdown-menu{padding:1.5em}.dropdown-list{padding-left:0;list-style:none}.dropdown-list>li{position:relative}.dropdown-list>li+li{margin-top:.5em}.dropdown-list-link{display:block;text-decoration:none}.dropdown-list-link:focus,.dropdown-list-link:hover{text-decoration:none}.dropdown-table{display:table;width:100%}.dropdown-table-row{display:table-row}.dropdown-table-column{display:table-cell;padding-top:.25em;padding-bottom:.25em;vertical-align:middle}.dropdown-table-column-top{vertical-align:top}.dropdown-table-icon{width:16px;padding-right:.5em}.dropdown-table-title{white-space:nowrap;padding-right:1.5em}.dropdown-table-title-ellipsis{max-width:230px;overflow:hidden;display:block;white-space:nowrap;text-overflow:ellipsis}.dropdown-table-actions{white-space:nowrap;text-align:right}.dropdown-table-actions-btn{text-align:center;display:inline-block!important;margin-top:-4px;margin-bottom:-4px;padding:4px;vertical-align:middle}.dropdown-table-actions-btn-close:hover,.dropdown-table-actions-btn-edit:hover{background-color:#333}.dropdown-table-actions-btn-delete:hover{background-color:#c83c3c}.avatar{position:relative;display:inline-block;height:32px;width:32px;vertical-align:middle}.avatar-image{display:block;height:32px;width:32px;overflow:hidden;border-radius:50%}.avatar-image:after{display:block;content:'';position:absolute;top:0;left:0;height:100%;width:100%;border-radius:50%;border:1px solid rgba(255,255,255,.1)}.avatar-image>img{display:block;width:100%!important;height:auto!important}.avatar-icon{position:absolute;bottom:0;right:0;height:16px;width:16px}.callout{background-color:#f0f0f0;border-left:3px solid #ccc;margin:20px 0;padding:20px;color:#333}.callout .media{margin:0}.callout .media .fa-stack{color:#fff}.callout .media .fa-stack>.fa:first-child{color:#ccc}.callout .media-body{vertical-align:middle}.callout-icon{margin-top:-2px}.callout-title{font-size:1.3em;margin:0 0 .5em}.callout-body>:last-child{margin-bottom:0}.callout-sm{margin:10px 0;padding:10px}.callout-sm .callout-title{font-size:1em;margin:0}.callout-success{background-color:#d1e2bd;border-color:#79a548;color:#333}.callout-success .media{margin:0}.callout-success .media .fa-stack{color:#fff}.callout-success .media .fa-stack>.fa:first-child{color:#79a548}.callout-info{background-color:#ebf3fb;border-color:#6daae0;color:#333}.callout-info .media{margin:0}.callout-info .media .fa-stack{color:#fff}.callout-info .media .fa-stack>.fa:first-child{color:#6daae0}.callout-warning{background-color:#fbefdd;border-color:#e8a33d;color:#333}.callout-warning .media{margin:0}.callout-warning .media .fa-stack{color:#fff}.callout-warning .media .fa-stack>.fa:first-child{color:#e8a33d}.callout-danger{background-color:#efc7c7;border-color:#c83c3c;color:#333}.callout-danger .media{margin:0}.callout-danger .media .fa-stack{color:#fff}.callout-danger .media .fa-stack>.fa:first-child{color:#c83c3c}.callout-notice{background-color:#f9f9f9;border-color:#a0a0a0;color:#333}.callout-notice .media{margin:0}.callout-notice .media .fa-stack{color:#fff}.callout-notice .media .fa-stack>.fa:first-child{color:#a0a0a0}.icon{position:relative;display:inline-block;overflow:hidden;white-space:nowrap;vertical-align:-22%}.icon img,.icon svg{display:block;height:100%;width:100%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.icon *{display:block;line-height:inherit}.icon-markup{position:absolute;display:block;text-align:center;top:0;left:0;right:0;bottom:0}.icon-overlay{position:absolute;bottom:0;right:0;height:68.75%;width:68.75%;text-align:center}.icon-color{fill:currentColor}.icon-spin .icon-markup{-webkit-animation:icon-spin 2s infinite linear;animation:icon-spin 2s infinite linear}@-webkit-keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.icon-state-disabled .icon-markup{opacity:.5}.icon-size-small{height:16px;width:16px;line-height:16px}.icon-size-small .icon-unify{line-height:16px;font-size:14px}.icon-size-small .icon-overlay .icon-unify{line-height:10px;font-size:9px}.icon-size-default{height:32px;width:32px;line-height:32px}.icon-size-default .icon-unify{line-height:32px;font-size:28px}.icon-size-default .icon-overlay .icon-unify{line-height:20px;font-size:18px}.icon-size-large{height:48px;width:48px;line-height:48px}.icon-size-large .icon-unify{line-height:48px;font-size:42px}.icon-size-large .icon-overlay .icon-unify{line-height:30px;font-size:26px}.icon-actions-edit-copy-release,.icon-actions-edit-cut-release,.icon-status-dialog-error,.icon-status-status-current,.icon-status-status-permission-denied{color:#c83c3c}.icon-status-status-sorting-light-asc,.icon-status-status-sorting-light-desc{color:#fff}.icon-status-status-sorting-asc,.icon-status-status-sorting-desc{color:#737373}.icon-status-dialog-information{color:#6daae0}.icon-status-dialog-ok,.icon-status-status-permission-granted{color:#79a548}.icon-status-dialog-notification{color:#333}.icon-status-dialog-warning{color:#e8a33d}.diff{background-color:#fff;border:1px solid #ccc;display:table}.diff-item{display:table-row}.diff-item+.diff-item{border-top:1px solid #ccc}.diff-item-result,.diff-item-title{padding:10px;display:table-cell}.diff-item-title{background-color:#fafafa;padding-right:10px;font-style:italic;white-space:nowrap}.diff-item-result{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;width:100%;white-space:pre;word-break:break-all;word-wrap:break-word}.diff-item-result del{color:#c80c05;background-color:#fff6f6;text-decoration:none}.diff-item-result ins{color:#44a512;background-color:#ebfce3;text-decoration:none}.diff-item-result.diff-item-result-inline{white-space:normal}.module{min-height:100%;width:100%;background-color:#fff;color:inherit}.module-dark{background-color:#333;color:#ccc}.module-loading-indicator{min-height:5px;width:100%;z-index:999999}.module-loading-indicator.nprogress-custom-parent{position:fixed;top:0}.module-docheader{position:fixed;width:100%;top:0;left:0;min-height:65px;z-index:300;background-color:#eee;border-bottom:1px solid #c3c3c3;padding:0 24px;-webkit-transition:margin-top .3s ease-in-out;transition:margin-top .3s ease-in-out}.module-docheader .module-docheader-bar{min-height:26px;margin:4px 0;line-height:26px}.module-docheader .module-docheader-bar.row{margin-left:-15px;margin-right:-15px}.module-docheader .module-docheader-bar label{margin-top:0;margin-bottom:0}.module-docheader .module-docheader-bar .form-inline .form-group{display:table}.module-docheader .module-docheader-bar .form-inline .form-group label{display:table-cell;font-size:11px;font-weight:400;line-height:16px;padding:4px;border-radius:2px 0 0 2px;border:1px solid #bbb;border-right:0;background-color:rgba(0,0,0,.05)}.module-docheader .module-docheader-bar .form-inline .form-group label+select{display:table-cell;border-top-left-radius:0;border-bottom-left-radius:0}.module-docheader .module-docheader-bar .form-group{vertical-align:top;margin:0;display:inline-block}.module-docheader .module-docheader-bar .form-group .form-control{vertical-align:top}.module-docheader .module-docheader-bar .form-inline-spaced{margin:0}.module-docheader .module-docheader-bar .panel{margin:0;border-left:none;border-right:none;border-bottom:none;border-radius:0;margin-left:-24px;margin-right:-24px;background-color:#fafafa;box-shadow:none}.module-docheader .module-docheader-bar .panel .panel-body{padding:8px 24px}@media (max-width:768px){.module-docheader .module-docheader-bar .text-right{text-align:left}}.module-docheader .module-docheader-bar-search{margin-bottom:0}.module-docheader .module-docheader-bar-column-left{float:left}.module-docheader .module-docheader-bar-column-right{float:right}.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:nowrap}@media (max-width:768px){.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:normal}}.module-docheader-bar-navigation .form-group select{width:100%}.module-body{padding:24px 24px}.module-body>.callout:first-child{margin-top:0}.module-body>.container{padding-left:0;padding-right:0}.module-body .container-small{max-width:768px;margin:0 auto}.module-docheader+.module-body{padding-top:89px}.panel{display:block}.panel:focus,.panel:hover{text-decoration:none}.panel-heading a,.panel-heading a:active,.panel-heading a:focus,.panel-heading a:hover{text-decoration:none;color:inherit}.panel-heading-left{float:left}.panel-heading-right{float:right}.panel-title{font-size:12px}.panel-title-icon,.panel-title-name{display:inline-block;vertical-align:middle}.panel-body>:first-child{margin-top:0}.panel-body>:last-child{margin-bottom:0}.panel-body-highlightlinks>p>a{text-decoration:underline}.panel-table td:first-child,.panel-table th:first-child{padding-left:15px}.panel-table td:last-child,.panel-table th:last-child{padding-right:15px}.panel-progress{background-color:#eee;height:3px;position:relative;width:100%}.panel-progress .panel-progress-bar{display:block;height:100%;background-color:#444}.panel-active{border-color:#444}.panel-active>.panel-heading{color:#fff;background-color:#666;border-color:#444}.panel-active>.panel-heading+.panel-collapse>.panel-body{border-top-color:#444}.panel-active>.panel-heading .badge{color:#666;background-color:#fff}.panel-active>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#444}.clearfix:after,.dropdown-list>li:after,.module-docheader .module-docheader-bar:after,.module-docheader:after,.modulemenu .modulemenu-group-header:after,.modulemenu .modulemenu-item-link:after,.panel-heading:after{content:"";display:table;clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs{display:none!important}.visible-sm{display:none!important}.visible-md{display:none!important}.visible-lg{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container *{box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15);clip:rect(0,0,0,0)}.chosen-container.chosen-with-drop .chosen-drop{clip:auto}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:2px;background-color:#fff;background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;font-size:1em;font-family:sans-serif;line-height:normal}.chosen-container-single .chosen-drop{margin-top:-1px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;clip:rect(0,0,0,0)}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#e8a33d;color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto;border:1px solid #aaa;background-color:#fff;cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:0 0!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;width:25px}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:4px 20px 4px 5px;max-width:100%;background-color:#e8a33d;background-clip:padding-box;color:#fff;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:5px;display:block;width:12px;height:12px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{text-decoration:none}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:after{content:"ï€";font-family:FontAwesome;padding-left:2px;vertical-align:top;color:#fff}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:none;background:0 0}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}.gridder{margin:15px;margin-left:-15px;margin-right:-15px;padding:0;list-style-type:none;font-size:0}.gridder-list,.gridder-show{font-size:12px}.gridder-list{display:inline-block;vertical-align:top;padding-left:15px;padding-right:15px;position:relative}.gridder-list.selectedItem:after{position:absolute;border:15px solid transparent;border-bottom-color:#fff;border-top:0;bottom:0;left:50%;margin-left:-7.5px;content:''}.gridder-list .gridder-item{background-color:#fff;box-shadow:0 2px 0 rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:30px;padding:10px;min-height:200px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform;cursor:pointer;position:relative}.gridder-list .gridder-item:focus,.gridder-list .gridder-item:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 3px 0 rgba(0,0,0,.3)}.gridder-list .gridder-item .label{padding:3px 6px;font-size:12px;vertical-align:top;border-radius:10px;min-width:28px;display:inline-block}.gridder-show{background-color:#fff;display:block;float:left;width:100%;position:relative;margin-bottom:15px}.gridder-show .gridder-padding{padding:30px}.gridder-show .gridder-title{border-bottom:1px solid #ccc;margin-bottom:15px}.gridder-content{display:none}.gridder-list{width:100%}@media (min-width:768px){.gridder-list{width:50%}}@media (min-width:992px){.gridder-list{width:25%}}.card{overflow:hidden;border-radius:2px;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;box-shadow:0 1px 1px rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:20px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform}a.card:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 2px 1px rgba(0,0,0,.3)}.card-container{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:10px -10px}.card-container .card{margin-left:10px;margin-right:10px}.card-size-large,.card-size-medium,.card-size-small{width:calc(100% - 20px)}@media (min-width:768px){.card-size-small{width:calc(50% - 20px)}}@media (min-width:992px){.card-size-small{width:calc(25% - 20px)}}@media (min-width:768px){.card-size-medium{width:calc(50% - 20px)}}@media (min-width:768px){.card-size-large{width:calc(100% - 20px)}}.card-size-fixed-small{width:calc(100% - 20px)}@media (min-width:624px){.card-size-fixed-small{width:calc(50% - 20px)}}@media (min-width:768px){.card-size-fixed-small{width:300px}}.card-content,.card-footer,.card-header,.card-image{padding:1.5em 1.5em 0 1.5em}.card-content:last-child,.card-footer:last-child,.card-header:last-child,.card-image:last-child{padding-bottom:1.5em}.card-content :first-child,.card-footer :first-child,.card-header :first-child,.card-image :first-child{margin-top:0}.card-content :last-child,.card-footer :last-child,.card-header :last-child,.card-image :last-child{margin-bottom:0}.card-image{position:relative;padding-left:0;padding-right:0}.card-image:first-child{padding-top:0}.card-image:first-child .card-image-badge{top:.75em}.card-image:last-child{padding-bottom:0}.card-image .card-image-badge{position:absolute;top:1.5em;right:.75em}.card-image img{display:block;height:auto;width:100%;margin:0 auto}.card-header .card-icon{float:left;margin-right:.75em}.card-header .card-header-body{display:block;overflow:hidden}.card-header .card-title{font-family:inherit;font-weight:500;display:block;font-size:1.35em;line-height:1.2em;margin:0}.card-header .card-subtitle{display:block;margin-top:.5em;font-size:1em;line-height:1.2em;opacity:.5}.card-header .card-longdesc{margin-top:1em}.card-content{height:100%}.minicolors{position:relative}.userTS .minicolors{position:absolute}.userTS .minicolors-panel{margin-top:31px}.userTS .minicolors-swatch{z-index:100000}.minicolors-sprite{background-image:url(../../../../../../typo3/sysext/core/Resources/Public/Images/colorpicker/jquery.minicolors.png)}.minicolors-swatch{position:absolute;vertical-align:middle;background-position:-80px 0;cursor:text;padding:0;margin:0;display:inline-block;top:50%;left:6px;z-index:2;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);width:20px;height:20px;border-radius:1px}.minicolors-swatch-color{position:absolute;top:0;left:0;right:0;bottom:0;border-radius:inherit}.minicolors-input{float:none;padding-left:32px}.minicolors-panel{margin-top:1px;overflow:hidden;border-radius:2px;position:absolute;width:173px;height:152px;background:#fff;border:solid 1px #bbb;box-shadow:0 0 20px rgba(0,0,0,.2);z-index:99999;box-sizing:content-box;display:none}.minicolors-panel.minicolors-with-swatches{height:182px}.minicolors-panel.minicolors-visible{display:block}.minicolors-position-top .minicolors-panel{top:-154px}.minicolors-position-right .minicolors-panel{right:0}.minicolors-position-bottom .minicolors-panel{top:auto}.minicolors-position-left .minicolors-panel{left:0}.minicolors-with-opacity .minicolors-panel{width:194px}.minicolors .minicolors-grid{position:absolute;top:1px;left:1px;width:150px;height:150px;background-position:-120px 0;cursor:crosshair}.minicolors .minicolors-grid-inner{position:absolute;top:0;left:0;width:150px;height:150px}.minicolors-slider-saturation .minicolors-grid{background-position:-420px 0}.minicolors-slider-saturation .minicolors-grid-inner{background-position:-270px 0;background-image:inherit}.minicolors-slider-brightness .minicolors-grid{background-position:-570px 0}.minicolors-slider-brightness .minicolors-grid-inner{background-color:#000}.minicolors-slider-wheel .minicolors-grid{background-position:-720px 0}.minicolors-opacity-slider,.minicolors-slider{position:absolute;top:1px;left:152px;width:20px;height:150px;background-color:#fff;background-position:0 0;cursor:row-resize}.minicolors-slider-saturation .minicolors-slider{background-position:-60px 0}.minicolors-slider-brightness .minicolors-slider{background-position:-20px 0}.minicolors-slider-wheel .minicolors-slider{background-position:-20px 0}.minicolors-opacity-slider{left:173px;background-position:-40px 0;display:none}.minicolors-with-opacity .minicolors-opacity-slider{display:block}.minicolors-grid .minicolors-picker{position:absolute;top:70px;left:70px;width:12px;height:12px;border:solid 1px #000;border-radius:10px;margin-top:-6px;margin-left:-6px;background:0 0}.minicolors-grid .minicolors-picker>div{position:absolute;top:0;left:0;width:8px;height:8px;border-radius:8px;border:solid 2px #fff;box-sizing:content-box}.minicolors-picker{position:absolute;top:0;left:0;width:18px;height:2px;background:#fff;border:solid 1px #000;margin-top:-2px;box-sizing:content-box}.minicolors-swatches,.minicolors-swatches li{margin:0;padding:0;list-style:none;overflow:hidden;position:absolute;top:157px;left:5px}.minicolors-swatches .minicolors-swatch{position:relative;float:left;cursor:pointer;margin:0 4px 0 0;top:0;left:0;width:20px;height:20px}.minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:7px}.minicolors-swatch.selected{border-color:#000}::-ms-clear{display:none}#typo3-docbody form{margin-bottom:1.25em}a.typo3-goBack{font-weight:700}a.typo3-goBack img{margin-right:5px;vertical-align:middle}span.typo3-moduleHeader img{margin-right:4px;vertical-align:middle}.has-change .checkbox,.has-change .checkbox-inline,.has-change .control-label,.has-change .help-block,.has-change .radio,.has-change .radio-inline,.has-change.checkbox label,.has-change.checkbox-inline label,.has-change.radio label,.has-change.radio-inline label{color:#6daae0}.has-change .form-control{border-color:#6daae0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-change .form-control:focus{border-color:#4392d7;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c1dbf2}.has-change .input-group-addon{color:#6daae0;border-color:#6daae0;background-color:#ebf3fb}.has-change .form-control-feedback{color:#6daae0}.has-change .thumbnail-status{border:1px solid #6daae0}.input-group-icon{width:32px;vertical-align:middle}.input-group-icon img{width:100%;max-height:18px}.input-group-addon{min-width:2.5em}label .icon img{pointer-events:none}.form-control{min-width:120px}.form-control-adapt{width:auto;max-width:100%}.form-control-wrap{margin:9px 0}.form-control-holder{position:relative}.row>.form-group>.form-control-wrap{margin-bottom:0}.form-group .t3js-formengine-field-item{position:relative}.form-group .t3js-formengine-field-item>.t3js-charcounter{left:0;position:absolute;top:100%}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{color:#737373}.form-control-icon{position:absolute;top:50%;left:15px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);z-index:1}.form-control-icon+.form-control,.form-control-icon+.form-control-clearable .form-control{padding-left:3.25em}.form-group.has-error label:before{font-family:FontAwesome;font-size:12px;text-align:center;content:"ïª";color:#c83c3c;display:inline-block}.form-group.has-error .btn-toolbar label:before{font-family:inherit;font-size:inherit;margin-right:inherit;text-align:inherit;content:'';color:inherit;display:block}.form-group.has-error .input-group-btn label{border-color:#c83c3c}.form-group.has-error .input-group-btn label .t3-icon{color:#c83c3c}.form-group.has-error .input-group-btn label:before{font-family:inherit;font-size:inherit;margin-right:inherit;text-align:inherit;content:'';color:inherit;display:block}select.form-control[multiple],select.form-control[size]{min-height:156px;width:100%!important}select.form-control[size="1"]{height:32px;min-height:0}select.form-control:not([size]),select.form-control[size="1"]{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:not([size])::-ms-expand,select.form-control[size="1"]::-ms-expand{display:none}select.form-control:not([size]):not(.form-select-no-siblings),select.form-control[size="1"]:not(.form-select-no-siblings){background-image:url(../../../../../../typo3/sysext/core/Resources/Public/Icons/T3Icons/actions/actions-view-list-expand.svg);background-position:right 4px center;background-repeat:no-repeat;background-size:16px 16px;padding-right:24px}.form-group-sm select.form-control:not([size]),.form-group-sm select.form-control[size="1"],.input-group-sm>.input-group-btn>select.form-control.btn:not([size]),.input-group-sm>.input-group-btn>select.form-control[size="1"].btn,.input-group-sm>select.form-control:not([size]),.input-group-sm>select.form-control[size="1"],select.form-control:not([size]).input-sm,select.form-control[size="1"].input-sm{line-height:16px}select.form-control>optgroup{margin-top:9px}select.form-control>optgroup:first-child{margin-top:0}select.form-control option{padding-top:2px;padding-bottom:2px}select.icon-select option{padding-left:22px}.form-control-clearable{position:relative}.form-control-clearable .form-control{padding-right:2.3em}.form-control-clearable .close{position:absolute;height:16px;z-index:3;top:50%;right:.5em;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.form-control-clearable .close .icon{vertical-align:0}.input-group .form-control-clearable{display:table-cell}.input-group .form-control-clearable .form-control{display:block}.form-notice-capslock{position:absolute;right:6px;top:50%;margin-top:-10px;height:20px;width:20px;padding:3px;z-index:10;background-color:#fff}.form-notice-capslock>img{display:block;opacity:.5}.form-inline-spaced{margin:0 -.5em 18px}.form-inline-spaced .form-group{margin:.5em .5em 0}.form-inline-spaced .form-group label{margin-right:.5em}.form-group-dashed+.form-group-dashed{padding-top:15px;border-top:1px dashed #ccc}.form-section{border:1px solid #ccc;background-color:#fafafa;padding:15px 12px 3px}.form-section+.form-section{margin-top:-1px}.tab-pane>.form-section:first-child{border-top:none}.form-section-headline{margin-top:0;margin-bottom:10px}.form-wizards-wrap{display:table;width:100%}.form-wizards-wrap>.form-wizards-element{display:table-cell;width:100%}.form-wizards-wrap>.form-wizards-items-top{display:table-row}.form-wizards-wrap>.form-wizards-items-aside{display:table-cell;vertical-align:top;padding-left:5px;white-space:nowrap}.form-wizards-wrap>.form-wizards-items-bottom{display:table-row}.form-wizards-wrap>.form-wizards-items-bottom:first-child{margin-top:4px}.form-irre-header{display:table;margin:-5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.form-irre-header-cell{display:table-cell;vertical-align:middle;white-space:nowrap;padding:5px}.form-irre-header-body{width:100%;font-weight:400;white-space:normal}.form-irre-header-body dl{margin-bottom:0}.form-irre-header-icon{padding-right:0}.form-irre-header-control{cursor:auto}.form-irre-header-control .btn-group>.btn{float:none}.form-multigroup-wrap{width:100%;display:table}.form-multigroup-wrap .form-multigroup-item{display:table-cell;width:50%;vertical-align:top}.form-multigroup-wrap .form-multigroup-item+.form-multigroup-item{padding-left:5px}.form-multigroup-wrap .form-multigroup-item-wizard{margin-bottom:5px}.form-multigroup-wrap .form-multigroup-item-wizard+select.form-control[multiple],.form-multigroup-wrap .form-multigroup-item-wizard+select.form-control[size]{min-height:125px}.form-multigroup-wrap .form-wizards-wrap{width:100%}.checkbox-row,.radio-row{margin-top:10px;margin-bottom:5px}.checkbox-column,.radio-column{margin-bottom:5px}.checkbox-column>.checkbox,.checkbox-column>.radio,.radio-column>.checkbox,.radio-column>.radio{margin:0}.checkbox-inline.checkbox,.checkbox-inline.radio,.radio-inline.checkbox,.radio-inline.radio{display:block;margin-left:0;margin-right:10px;margin-bottom:10px;padding:0}@media (max-width:767px){.checkbox-inline.checkbox+.checkbox,.checkbox-inline.checkbox+.radio,.checkbox-inline.radio+.checkbox,.checkbox-inline.radio+.radio,.radio-inline.checkbox+.checkbox,.radio-inline.checkbox+.radio,.radio-inline.radio+.checkbox,.radio-inline.radio+.radio{margin-top:-5px}}@media (min-width:768px){.checkbox-inline.checkbox,.checkbox-inline.radio,.radio-inline.checkbox,.radio-inline.radio{display:inline-block;margin-top:10px}.checkbox-inline.checkbox label,.checkbox-inline.radio label,.radio-inline.checkbox label,.radio-inline.radio label{white-space:nowrap}}textarea.formengine-textarea{resize:none}#typo3-docheader{background:#eee}#typo3-docheader img,#typo3-docheader input{cursor:pointer}#typo3-docheader .t3-icon{margin-bottom:3px}#typo3-docheader .left{float:left}#typo3-docheader .left .t3-icon{margin-right:6px}#typo3-docheader .right{float:right}#typo3-docheader .right .t3-icon{margin-left:6px}#typo3-docheader .buttongroup{float:left;margin-right:6px}#typo3-docheader .buttongroup .c-inputButton{color:inherit;padding:0}#typo3-docheader .buttongroup input.c-inputButton{text-indent:-1000px}#typo3-docheader select{margin-right:12px}#typo3-docheader a{color:#2d2d2d}#typo3-docheader a:hover{color:#000}#typo3-docheader a.active{color:#c3c3c3}#typo3-docheader a.active span{cursor:default}#typo3-docheader .typo3-docheader-buttons,#typo3-docheader .typo3-docheader-functions{color:#2d2d2d;overflow:hidden;padding:0 24px}#typo3-docheader .typo3-docheader-functions{height:27px;line-height:27px}#typo3-docheader .typo3-docheader-functions select{color:#2d2d2d}#typo3-docheader .typo3-docheader-buttons{height:22px;padding-top:3px;padding-bottom:3px;border-bottom:1px solid #c3c3c3}.alert-notice{background-color:#333;border-color:transparent;color:#fff}.alert-notice hr{border-top-color:transparent}.alert-notice .alert-link{color:#e6e5e5}.alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);border:0}.alert a{color:inherit;text-decoration:underline}.alert .media{margin:0}.alert .media .fa-stack>.fa:first-child{opacity:.2}.alert .media-body{vertical-align:middle}.alert-title{font-size:1.12em;font-weight:700;margin:0 0 .25em}.alert-body,.alert-message{margin:0;font-size:.9em}.alert-body>:last-child,.alert-message>:last-child{margin-bottom:0}.alert-body>ul,.alert-message>ul{padding-left:1.5em}.alert-dismissible .close{opacity:.5;padding:1px;top:-3px;right:-22px;color:inherit}.alert-dismissible .close:hover{opacity:1;color:inherit}#alert-container{width:400px;position:absolute;right:5px;top:46px;z-index:10000}#alert-container .alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1),0 2px 0 0 rgba(0,0,0,.15);position:relative;margin:5px auto}#alert-container .alert.fade.in{opacity:.95}body.backend .module{background:#f5f5f5}.content-area{padding-bottom:35px}.content-area>h3{margin-top:0}.content-area>:last-child{margin-bottom:0}.logo-pageheader img{padding-bottom:3px}img.logo{vertical-align:bottom}.typo3-message>h4{margin-bottom:0}.typo3-message p{margin-top:9px}.t3-install-displaytwinimageimages{border:1px solid #ccc;padding:10px}.t3-install-displaytwinimagetextarea pre{border-top:0}.bg-transparent-emulation{padding:10px;text-align:center;background:url(../../../../../../typo3/sysext/install/Resources/Public/Images/bg_transparent_emulation.png)}.bg-transparent-emulation img{max-width:300px}.alert-notice{background-color:#eee;border-color:#bbb;color:#333}.alert-notice hr{border-top-color:#aeaeae}.alert-notice .alert-link{color:#1a1919}.nav-pills>li>a{border-radius:0}h1:first-child{margin-top:0}.typo3-docheader-buttons,.typo3-docheader-functions{min-height:20px}.item{margin:1em;border:1px solid #ddd}.item .item-heading{padding:1em;background-color:#ddd}.item .item-body{padding:1em}.list-group-item a{display:block}.list-group-item.active a{color:#fff}.caret{border:0;padding-left:10px}.caret:after{position:relative;top:-8px;left:-10px;content:"";font-family:FontAwesome}.collapsed .caret:after{content:"";font-family:FontAwesome}.panel-heading{position:relative}.panel-heading .panel-checkbox{margin:0;position:absolute;left:1em;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.panel-heading .panel-checkbox+.panel-title{padding-left:18px}.panel-heading .message{display:block;padding-left:16px;margin-top:5px}a[data-toggle=collapse]{display:block}@media (min-width:992px){.affix-bottom{position:absolute}body.standalone .affix-top{position:relative}.affix{position:fixed;top:35px}body.backend .affix-top{position:fixed;top:35px}body.backend .leftNavigation{min-height:425px}}hr{border-top-color:#ddd}.copyright .panel-default:last-child{margin-bottom:0}#fixed-footer-handler{height:32px}.fixed{position:fixed;bottom:0;background-color:grey}.fixed .footer-innerWrap{padding:1.5em}@media (max-width:991px){#menuWrapper{position:relative!important;margin-bottom:30px}}#mobileMenuWrapper{margin-bottom:10px}#install-menu-button{float:right;margin-bottom:20px}#install-menu-button .navbar-toggle{border:0;background:#fff}#install-menu-button .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px;background-color:#000}#install-menu-button .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.form-control-clearable{position:relative}.form-control-clearable .form-control{padding-right:2.3em}.form-control-clearable .close{position:absolute;height:16px;z-index:3;top:50%;right:.5em;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.form-control-clearable .close .icon{vertical-align:0}.input-group .form-control-clearable{display:table-cell}.input-group .form-control-clearable .form-control{display:block}a[data-toggle=collapse]{text-decoration:none}.panel-group-flat .panel-body,.panel-group-rst .panel-body{padding-right:0}.panel-flat,.panel-rst,.panel-version{border:0;border-left:2px solid #d7d7d7;border-radius:0;margin:0}.panel-flat.panel-default .panel-heading,.panel-rst.panel-default .panel-heading,.panel-version.panel-default .panel-heading{background:#f5f5f5}.panel-flat.panel-breaking,.panel-flat.panel-danger,.panel-rst.panel-breaking,.panel-rst.panel-danger,.panel-version.panel-breaking,.panel-version.panel-danger{border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading,.panel-flat.panel-danger>.panel-heading,.panel-rst.panel-breaking>.panel-heading,.panel-rst.panel-danger>.panel-heading,.panel-version.panel-breaking>.panel-heading,.panel-version.panel-danger>.panel-heading{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading .badge,.panel-flat.panel-danger>.panel-heading .badge,.panel-rst.panel-breaking>.panel-heading .badge,.panel-rst.panel-danger>.panel-heading .badge,.panel-version.panel-breaking>.panel-heading .badge,.panel-version.panel-danger>.panel-heading .badge{color:#c83c3c;background-color:#fff}.panel-flat.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.panel-flat.panel-breaking.risk-high>.panel-heading,.panel-flat.panel-danger.risk-high>.panel-heading,.panel-rst.panel-breaking.risk-high>.panel-heading,.panel-rst.panel-danger.risk-high>.panel-heading,.panel-version.panel-breaking.risk-high>.panel-heading,.panel-version.panel-danger.risk-high>.panel-heading{background:#c83c3c;color:#f5f5f5}.panel-flat.panel-breaking.risk-medium>.panel-heading,.panel-flat.panel-danger.risk-medium>.panel-heading,.panel-rst.panel-breaking.risk-medium>.panel-heading,.panel-rst.panel-danger.risk-medium>.panel-heading,.panel-version.panel-breaking.risk-medium>.panel-heading,.panel-version.panel-danger.risk-medium>.panel-heading{background:#f5dbdb;color:#1e1e1e}.panel-flat.panel-breaking.risk-low>.panel-heading,.panel-flat.panel-danger.risk-low>.panel-heading,.panel-rst.panel-breaking.risk-low>.panel-heading,.panel-rst.panel-danger.risk-low>.panel-heading,.panel-version.panel-breaking.risk-low>.panel-heading,.panel-version.panel-danger.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-breaking .panel-progress .panel-progress-bar,.panel-flat.panel-danger .panel-progress .panel-progress-bar,.panel-rst.panel-breaking .panel-progress .panel-progress-bar,.panel-rst.panel-danger .panel-progress .panel-progress-bar,.panel-version.panel-breaking .panel-progress .panel-progress-bar,.panel-version.panel-danger .panel-progress .panel-progress-bar{background-color:#c83c3c}.panel-flat.panel-deprecation,.panel-flat.panel-warning,.panel-rst.panel-deprecation,.panel-rst.panel-warning,.panel-version.panel-deprecation,.panel-version.panel-warning{border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading,.panel-flat.panel-warning>.panel-heading,.panel-rst.panel-deprecation>.panel-heading,.panel-rst.panel-warning>.panel-heading,.panel-version.panel-deprecation>.panel-heading,.panel-version.panel-warning>.panel-heading{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading .badge,.panel-flat.panel-warning>.panel-heading .badge,.panel-rst.panel-deprecation>.panel-heading .badge,.panel-rst.panel-warning>.panel-heading .badge,.panel-version.panel-deprecation>.panel-heading .badge,.panel-version.panel-warning>.panel-heading .badge{color:#e8a33d;background-color:#fff}.panel-flat.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-flat.panel-deprecation.risk-high>.panel-heading,.panel-flat.panel-warning.risk-high>.panel-heading,.panel-rst.panel-deprecation.risk-high>.panel-heading,.panel-rst.panel-warning.risk-high>.panel-heading,.panel-version.panel-deprecation.risk-high>.panel-heading,.panel-version.panel-warning.risk-high>.panel-heading{background:#e8a33d;color:#f5f5f5}.panel-flat.panel-deprecation.risk-medium>.panel-heading,.panel-flat.panel-warning.risk-medium>.panel-heading,.panel-rst.panel-deprecation.risk-medium>.panel-heading,.panel-rst.panel-warning.risk-medium>.panel-heading,.panel-version.panel-deprecation.risk-medium>.panel-heading,.panel-version.panel-warning.risk-medium>.panel-heading{background:#f8e4c6;color:#1e1e1e}.panel-flat.panel-deprecation.risk-low>.panel-heading,.panel-flat.panel-warning.risk-low>.panel-heading,.panel-rst.panel-deprecation.risk-low>.panel-heading,.panel-rst.panel-warning.risk-low>.panel-heading,.panel-version.panel-deprecation.risk-low>.panel-heading,.panel-version.panel-warning.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-deprecation .panel-progress .panel-progress-bar,.panel-flat.panel-warning .panel-progress .panel-progress-bar,.panel-rst.panel-deprecation .panel-progress .panel-progress-bar,.panel-rst.panel-warning .panel-progress .panel-progress-bar,.panel-version.panel-deprecation .panel-progress .panel-progress-bar,.panel-version.panel-warning .panel-progress .panel-progress-bar{background-color:#e8a33d}.panel-flat.panel-feature,.panel-flat.panel-success,.panel-rst.panel-feature,.panel-rst.panel-success,.panel-version.panel-feature,.panel-version.panel-success{border-color:#79a548}.panel-flat.panel-feature>.panel-heading,.panel-flat.panel-success>.panel-heading,.panel-rst.panel-feature>.panel-heading,.panel-rst.panel-success>.panel-heading,.panel-version.panel-feature>.panel-heading,.panel-version.panel-success>.panel-heading{color:#fff;background-color:#79a548;border-color:#79a548}.panel-flat.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-flat.panel-feature>.panel-heading .badge,.panel-flat.panel-success>.panel-heading .badge,.panel-rst.panel-feature>.panel-heading .badge,.panel-rst.panel-success>.panel-heading .badge,.panel-version.panel-feature>.panel-heading .badge,.panel-version.panel-success>.panel-heading .badge{color:#79a548;background-color:#fff}.panel-flat.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-flat.panel-feature.risk-high>.panel-heading,.panel-flat.panel-success.risk-high>.panel-heading,.panel-rst.panel-feature.risk-high>.panel-heading,.panel-rst.panel-success.risk-high>.panel-heading,.panel-version.panel-feature.risk-high>.panel-heading,.panel-version.panel-success.risk-high>.panel-heading{background:#79a548;color:#f5f5f5}.panel-flat.panel-feature.risk-medium>.panel-heading,.panel-flat.panel-success.risk-medium>.panel-heading,.panel-rst.panel-feature.risk-medium>.panel-heading,.panel-rst.panel-success.risk-medium>.panel-heading,.panel-version.panel-feature.risk-medium>.panel-heading,.panel-version.panel-success.risk-medium>.panel-heading{background:#ddeacf;color:#1e1e1e}.panel-flat.panel-feature.risk-low>.panel-heading,.panel-flat.panel-success.risk-low>.panel-heading,.panel-rst.panel-feature.risk-low>.panel-heading,.panel-rst.panel-success.risk-low>.panel-heading,.panel-version.panel-feature.risk-low>.panel-heading,.panel-version.panel-success.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-feature .panel-progress .panel-progress-bar,.panel-flat.panel-success .panel-progress .panel-progress-bar,.panel-rst.panel-feature .panel-progress .panel-progress-bar,.panel-rst.panel-success .panel-progress .panel-progress-bar,.panel-version.panel-feature .panel-progress .panel-progress-bar,.panel-version.panel-success .panel-progress .panel-progress-bar{background-color:#79a548}.panel-flat.panel-important,.panel-flat.panel-info,.panel-rst.panel-important,.panel-rst.panel-info,.panel-version.panel-important,.panel-version.panel-info{border-color:#6daae0}.panel-flat.panel-important>.panel-heading,.panel-flat.panel-info>.panel-heading,.panel-rst.panel-important>.panel-heading,.panel-rst.panel-info>.panel-heading,.panel-version.panel-important>.panel-heading,.panel-version.panel-info>.panel-heading{color:#fff;background-color:#6daae0;border-color:#6daae0}.panel-flat.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-flat.panel-important>.panel-heading .badge,.panel-flat.panel-info>.panel-heading .badge,.panel-rst.panel-important>.panel-heading .badge,.panel-rst.panel-info>.panel-heading .badge,.panel-version.panel-important>.panel-heading .badge,.panel-version.panel-info>.panel-heading .badge{color:#6daae0;background-color:#fff}.panel-flat.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-flat.panel-important.risk-high>.panel-heading,.panel-flat.panel-info.risk-high>.panel-heading,.panel-rst.panel-important.risk-high>.panel-heading,.panel-rst.panel-info.risk-high>.panel-heading,.panel-version.panel-important.risk-high>.panel-heading,.panel-version.panel-info.risk-high>.panel-heading{background:#6daae0;color:#f5f5f5}.panel-flat.panel-important.risk-medium>.panel-heading,.panel-flat.panel-info.risk-medium>.panel-heading,.panel-rst.panel-important.risk-medium>.panel-heading,.panel-rst.panel-info.risk-medium>.panel-heading,.panel-version.panel-important.risk-medium>.panel-heading,.panel-version.panel-info.risk-medium>.panel-heading{background:#ebf3fb;color:#1e1e1e}.panel-flat.panel-important.risk-low>.panel-heading,.panel-flat.panel-info.risk-low>.panel-heading,.panel-rst.panel-important.risk-low>.panel-heading,.panel-rst.panel-info.risk-low>.panel-heading,.panel-version.panel-important.risk-low>.panel-heading,.panel-version.panel-info.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-important .panel-progress .panel-progress-bar,.panel-flat.panel-info .panel-progress .panel-progress-bar,.panel-rst.panel-important .panel-progress .panel-progress-bar,.panel-rst.panel-info .panel-progress .panel-progress-bar,.panel-version.panel-important .panel-progress .panel-progress-bar,.panel-version.panel-info .panel-progress .panel-progress-bar{background-color:#6daae0}.panel-flat .panel-heading,.panel-rst .panel-heading,.panel-version .panel-heading{position:relative}.panel-flat .panel-heading a.link-action,.panel-rst .panel-heading a.link-action,.panel-version .panel-heading a.link-action{cursor:pointer}.panel-flat .panel-heading strong,.panel-rst .panel-heading strong,.panel-version .panel-heading strong{line-height:1.5em}.panel-flat pre,.panel-rst pre,.panel-version pre{margin:0;border-radius:0;border:0;border-top:1px solid #d7d7d7;white-space:pre-wrap;word-break:normal;word-wrap:normal}.upgrade_analysis_item_to_filter pre a{text-decoration:underline}#phpinfo table{width:100%;table-layout:fixed;word-wrap:break-word} \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ExtensionConfiguration.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ExtensionConfiguration.js new file mode 100644 index 0000000000000000000000000000000000000000..5db58ecb6c0aa6f850965b84af871d4222a403ad --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ExtensionConfiguration.js @@ -0,0 +1,228 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/ExtensionConfiguration + */ +define([ + 'jquery', + 'TYPO3/CMS/Install/Router', + 'TYPO3/CMS/Install/FlashMessage', + 'TYPO3/CMS/Install/ProgressBar', + 'TYPO3/CMS/Install/InfoBox', + 'TYPO3/CMS/Install/Severity', + 'bootstrap' +], function($, Router, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorGridderOpener: 't3js-extensionConfiguration-open', + selectorContentContainer: '.t3js-extensionConfiguration-content', + selectorFormListener: '.t3js-extensionConfiguration-form', + selectorWriteToken: '#t3js-extensionConfiguration-write-token', + selectorOutputContainer: '.t3js-extensionConfiguration-output', + selectorSearchInput: '.t3js-extensionConfiguration-search', + + initialize: function() { + var self = this; + + // Get extension configuration list on card open + $(document).on('cardlayout:card-opened', function(event, $card) { + if ($card.hasClass(self.selectorGridderOpener)) { + self.getContent(); + } + }); + + // Focus search field on certain user interactions + $(document).on('keydown', function(e) { + var $searchInput = $(self.selectorSearchInput); + if (e.ctrlKey || e.metaKey) { + // Focus search field on ctrl-f + switch (String.fromCharCode(e.which).toLowerCase()) { + case 'f': + e.preventDefault(); + $searchInput.focus(); + break; + } + } else if (e.keyCode === 27) { + // Clear search on ESC key + e.preventDefault(); + $searchInput.val('').focus(); + } + }); + + // Perform expand collapse on search matches + $(document).on('keyup', this.selectorSearchInput, function() { + var typedQuery = $(this).val(); + var $searchInput = $(self.selectorSearchInput); + $('.search-item').each(function() { + var $item = $(this); + if ($(':contains(' + typedQuery + ')', $item).length > 0 || $('input[value*="' + typedQuery + '"]', $item).length > 0) { + $item.removeClass('hidden').addClass('searchhit'); + } else { + $item.removeClass('searchhit').addClass('hidden'); + } + }); + $('.searchhit').collapse('show'); + // Make search field clearable + require(['jquery.clearable'], function() { + $searchInput.clearable().focus(); + }); + }); + + $(document).on('submit', this.selectorFormListener, function(e) { + e.preventDefault(); + self.write($(this)); + }); + }, + + getContent: function() { + var self = this; + var outputContainer = $(this.selectorContentContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + outputContainer.empty().html(message); + $.ajax({ + url: Router.getUrl('extensionConfigurationGetContent'), + cache: false, + success: function(data) { + if (data.success === true && data.html !== 'undefined' && data.html.length > 0) { + outputContainer.empty().append(data.html); + self.initializeWrap(); + } else { + var message = InfoBox.render(Severity.error, 'Something went wrong', ''); + outputContainer.empty().append(message); + } + }, + error: function(xhr) { + Router.handleAjaxError(xhr); + } + }); + }, + + /** + * Submit the form and show the result message + * + * @param {jQuery} $form The form of the current extension + */ + write: function($form) { + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.append(message); + var extensionConfiguration = { }; + $.each($form.serializeArray(), function() { + extensionConfiguration[this.name] = this.value; + }); + $.ajax({ + url: Router.getUrl(), + method: 'POST', + data: { + 'install': { + 'token': $(this.selectorWriteToken).text(), + 'action': 'extensionConfigurationWrite', + 'extensionKey': $form.attr('data-extensionKey'), + 'extensionConfiguration': extensionConfiguration + } + }, + success: function (data) { + if (data.success === true && Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.empty().append(message); + }); + } else { + var message = InfoBox.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }, + error: function(xhr) { + Router.handleAjaxError(xhr); + } + }).always(function() { + $outputContainer.find('.alert-loading').remove(); + }); + }, + + /** + * configuration properties + */ + initializeWrap: function() { + $('.t3js-emconf-offset').each(function() { + var $me = $(this), + $parent = $me.parent(), + id = $me.attr('id'), + val = $me.attr('value'), + valArr = val.split(','); + + $me.attr('data-offsetfield-x', '#' + id + '_offset_x') + .attr('data-offsetfield-y', '#' + id + '_offset_y') + .wrap('<div class="hidden"></div>'); + + var elementX = '' + + '<div class="form-multigroup-item">' + + '<div class="input-group">' + + '<div class="input-group-addon">x</div>' + + '<input id="' + id + '_offset_x" class="form-control t3js-emconf-offsetfield" data-target="#' + id + '" value="' + $.trim(valArr[0]) + '">' + + '</div>' + + '</div>'; + var elementY = '' + + '<div class="form-multigroup-item">' + + '<div class="input-group">' + + '<div class="input-group-addon">y</div>' + + '<input id="' + id + '_offset_y" class="form-control t3js-emconf-offsetfield" data-target="#' + id + '" value="' + $.trim(valArr[1]) + '">' + + '</div>' + + '</div>'; + + var offsetGroup = '<div class="form-multigroup-wrap">' + elementX + elementY + '</div>'; + $parent.append(offsetGroup); + $parent.find('.t3js-emconf-offset').keyup(function() { + var $target = $($(this).data('target')); + $target.attr( + 'value', + $($target.data('offsetfield-x')).val() + ',' + $($target.data('offsetfield-y')).val() + ); + }); + }); + + $('.t3js-emconf-wrap').each(function() { + var $me = $(this), + $parent = $me.parent(), + id = $me.attr('id'), + val = $me.attr('value'), + valArr = val.split('|'); + + $me.attr('data-wrapfield-start', '#' + id + '_wrap_start') + .attr('data-wrapfield-end', '#' + id + '_wrap_end') + .wrap('<div class="hidden"></div>'); + + var elementStart = '' + + '<div class="form-multigroup-item">' + + '<input id="' + id + '_wrap_start" class="form-control t3js-emconf-wrapfield" data-target="#' + id + '" value="' + $.trim(valArr[0]) + '">' + + '</div>'; + var elementEnd = '' + + '<div class="form-multigroup-item">' + + '<input id="' + id + '_wrap_end" class="form-control t3js-emconf-wrapfield" data-target="#' + id + '" value="' + $.trim(valArr[1]) + '">' + + '</div>'; + + var wrapGroup = '<div class="form-multigroup-wrap">' + elementStart + elementEnd + '</div>'; + $parent.append(wrapGroup); + $parent.find('.t3js-emconf-wrapfield').keyup(function() { + var $target = $($(this).data('target')); + $target.attr( + 'value', + $($target.data('wrapfield-start')).val() + '|' + $($target.data('wrapfield-end')).val() + ); + }); + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/LocalConfiguration.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/LocalConfiguration.js index 529dec90c9e4728cd9dbe71c6f5e4fa381f70a24..f96e1850344815e6028c9420ab93a00ac858fb7e 100644 --- a/typo3/sysext/install/Resources/Public/JavaScript/Modules/LocalConfiguration.js +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/LocalConfiguration.js @@ -184,12 +184,14 @@ define([ */ handleButtonScrolling: function() { var $fixedFooterHandler = $('#fixed-footer-handler'); - var $fixedFooter = $('#fixed-footer'); - if (!this.isScrolledIntoView($fixedFooterHandler)) { - $fixedFooter.addClass('fixed'); - $fixedFooter.width($('.t3js-localConfiguration .panel-group').width()); - } else { - $fixedFooter.removeClass('fixed'); + if ($fixedFooterHandler.length > 0) { + var $fixedFooter = $('#fixed-footer'); + if (!this.isScrolledIntoView($fixedFooterHandler)) { + $fixedFooter.addClass('fixed'); + $fixedFooter.width($('.t3js-localConfiguration .panel-group').width()); + } else { + $fixedFooter.removeClass('fixed'); + } } }, diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/Router.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/Router.js index dbf09e6187d395cc42f5123a417c307f1636d654..1a43de4ad1303cbb227e91426ad51c65fc11bb23 100644 --- a/typo3/sysext/install/Resources/Public/JavaScript/Modules/Router.js +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/Router.js @@ -72,7 +72,7 @@ define([ cache: false, success: function(data) { if (data.success === true) { - self.loadMainLayout(); + self.executeSilentLegacyExtConfExtensionConfigurationUpdate(); } else { self.executeSilentConfigurationUpdate(); } @@ -83,6 +83,55 @@ define([ }); }, + /** + * Legacy layer to upmerge LocalConfiguration EXT/extConf serialized array keys + * to EXTENSIONS array in LocalConfiguration for initial update from v8 to v9. + * + * @deprecated since TYPO3 v9, will be removed with v10 - re-route executeSilentConfigurationUpdate() + * to executeSilentExtensionConfigurationUpdate() on removal of this function. + */ + executeSilentLegacyExtConfExtensionConfigurationUpdate: function() { + var self = this; + $.ajax({ + url: this.getUrl('executeSilentLegacyExtConfExtensionConfigurationUpdate', 'layout'), + cache: false, + success: function(data) { + if (data.success === true) { + self.executeSilentExtensionConfigurationSynchronization(); + } else { + var message = InfoBox.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().append(message); + } + }, + error: function(xhr) { + self.handleAjaxError(xhr); + } + }); + }, + + /** + * Extensions which come with new default settings in ext_conf_template.txt extension + * configuration files get their new defaults written to LocalConfiguration. + */ + executeSilentExtensionConfigurationSynchronization: function() { + var self = this; + $.ajax({ + url: this.getUrl('executeSilentExtensionConfigurationSynchronization', 'layout'), + cache: false, + success: function(data) { + if (data.success === true) { + self.loadMainLayout(); + } else { + var message = InfoBox.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().append(message); + } + }, + error: function(xhr) { + self.handleAjaxError(xhr); + } + }); + }, + loadMainLayout: function() { var self = this; var $outputContainer = $(this.selectorBody); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js b/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js index 3935d2155ace904bb7d2b66bdf624f4cafada01b..7aca611178aa019590f990e52c9f7367962f70b3 100644 --- a/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js +++ b/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js @@ -6,6 +6,7 @@ var require = { 'TYPO3/CMS/Install': 'sysext/install/Resources/Public/JavaScript/Modules/', 'jquery': 'sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery-3.2.1.min', 'jquery.clearable': 'sysext/backend/Resources/Public/JavaScript/jquery.clearable', + 'TYPO3/CMS/Core/Contrib/jquery.minicolors': 'sysext/core/Resources/Public/JavaScript/Contrib/jquery.minicolors', 'bootstrap': 'sysext/install/Resources/Public/JavaScript/bootstrap.min', 'chosen': 'sysext/install/Resources/Public/JavaScript/chosen.jquery.min' }, diff --git a/typo3/sysext/rsaauth/Classes/Backend/CommandLineBackend.php b/typo3/sysext/rsaauth/Classes/Backend/CommandLineBackend.php index d7973c032069d29df326b0b059944704c37aaa6c..532b2f05475acc3d563512abbc53d92676811492 100644 --- a/typo3/sysext/rsaauth/Classes/Backend/CommandLineBackend.php +++ b/typo3/sysext/rsaauth/Classes/Backend/CommandLineBackend.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Rsaauth\Backend; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Utility\CommandUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\StringUtility; @@ -54,14 +55,9 @@ class CommandLineBackend extends AbstractBackend { $this->opensslPath = CommandUtility::getCommand('openssl'); // Get temporary directory from the configuration - $extconf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['rsaauth'], ['allowed_classes' => false]); - if ( - $extconf['temporaryDirectory'] !== '' - && $extconf['temporaryDirectory'][0] === '/' - && @is_dir($extconf['temporaryDirectory']) - && is_writable($extconf['temporaryDirectory']) - ) { - $this->temporaryDirectory = $extconf['temporaryDirectory']; + $path = trim(GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('rsaauth', 'temporaryDirectory')); + if ($path !== '' && $path[0] === '/' && @is_dir($path) && is_writable($path)) { + $this->temporaryDirectory = $path; } else { $this->temporaryDirectory = PATH_site . 'typo3temp/var/transient'; } diff --git a/typo3/sysext/rsaauth/Classes/BackendWarnings.php b/typo3/sysext/rsaauth/Classes/BackendWarnings.php index e15fb346b621456f5da16c5a718cc2be8d212e5c..396f4145f707c5cd377b377f8acabbfb9b74fb0e 100644 --- a/typo3/sysext/rsaauth/Classes/BackendWarnings.php +++ b/typo3/sysext/rsaauth/Classes/BackendWarnings.php @@ -13,6 +13,8 @@ namespace TYPO3\CMS\Rsaauth; * * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Utility\GeneralUtility; /** * This class contains a hook to the backend warnings collection. It checks @@ -33,8 +35,7 @@ class BackendWarnings $lang = $this->getLanguageService(); $warnings['rsaauth_cmdline'] = $lang->sL('LLL:EXT:rsaauth/Resources/Private/Language/locallang.xlf:hook_using_cmdline'); // Check the path - $extconf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['rsaauth'], ['allowed_classes' => false]); - $path = trim($extconf['temporaryDirectory']); + $path = trim(GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('rsaauth', 'temporaryDirectory')); if ($path == '') { // Path is empty $warnings['rsaauth'] = $lang->sL('LLL:EXT:rsaauth/Resources/Private/Language/locallang.xlf:hook_empty_directory'); diff --git a/typo3/sysext/rsaauth/Tests/Unit/Backend/CommandLineBackendTest.php b/typo3/sysext/rsaauth/Tests/Unit/Backend/CommandLineBackendTest.php index b74a403932daa805687cf8bff8704f1555cf067d..a6231c8b0a5f4c6f7e4d5ad41ef2ccbb16e8824d 100644 --- a/typo3/sysext/rsaauth/Tests/Unit/Backend/CommandLineBackendTest.php +++ b/typo3/sysext/rsaauth/Tests/Unit/Backend/CommandLineBackendTest.php @@ -31,7 +31,7 @@ class CommandLineBackendTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestC if (TYPO3_OS === 'WIN') { $this->markTestSkipped('This test is not available on Windows as auto-detection of openssl path will fail.'); } - + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['rsaauth']['temporaryDirectory'] = ''; $this->subject = new CommandLineBackend(); } diff --git a/typo3/sysext/saltedpasswords/Classes/Utility/ExtensionManagerConfigurationUtility.php b/typo3/sysext/saltedpasswords/Classes/Utility/ExtensionManagerConfigurationUtility.php index 38af2cbeab4f9274af0dfb5702e2911a2bd2b933..2fca23b84de9cc1ef51e74437f1266d283e861f5 100644 --- a/typo3/sysext/saltedpasswords/Classes/Utility/ExtensionManagerConfigurationUtility.php +++ b/typo3/sysext/saltedpasswords/Classes/Utility/ExtensionManagerConfigurationUtility.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Saltedpasswords\Utility; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -146,9 +147,9 @@ class ExtensionManagerConfigurationUtility private function init() { $requestSetup = $this->processPostData((array) $_REQUEST['data']); - $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['saltedpasswords'], ['allowed_classes' => false]); - $this->extConf['BE'] = array_merge((array)$extConf['BE.'], (array)$requestSetup['BE.']); - $this->extConf['FE'] = array_merge((array)$extConf['FE.'], (array)$requestSetup['FE.']); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('saltedpasswords'); + $this->extConf['BE'] = array_merge((array)$extConf['BE'], (array)$requestSetup['BE']); + $this->extConf['FE'] = array_merge((array)$extConf['FE'], (array)$requestSetup['FE']); $this->getLanguageService()->includeLLFile('EXT:saltedpasswords/Resources/Private/Language/locallang.xlf'); } diff --git a/typo3/sysext/saltedpasswords/Classes/Utility/SaltedPasswordsUtility.php b/typo3/sysext/saltedpasswords/Classes/Utility/SaltedPasswordsUtility.php index b5f2e983e5bce756aecd5026febb9df0d153489d..5a8b359217fe82cf31ea86cadd44fe5684538b55 100644 --- a/typo3/sysext/saltedpasswords/Classes/Utility/SaltedPasswordsUtility.php +++ b/typo3/sysext/saltedpasswords/Classes/Utility/SaltedPasswordsUtility.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Saltedpasswords\Utility; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -59,11 +60,11 @@ class SaltedPasswordsUtility public static function returnExtConf($mode = TYPO3_MODE) { $currentConfiguration = self::returnExtConfDefaults(); - if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['saltedpasswords'])) { - $extensionConfiguration = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['saltedpasswords'], ['allowed_classes' => false]); + if (isset($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['saltedpasswords'])) { + $extensionConfiguration = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('saltedpasswords'); // Merge default configuration with modified configuration: - if (isset($extensionConfiguration[$mode . '.'])) { - $currentConfiguration = array_merge($currentConfiguration, $extensionConfiguration[$mode . '.']); + if (isset($extensionConfiguration[$mode])) { + $currentConfiguration = array_merge($currentConfiguration, $extensionConfiguration[$mode]); } } return $currentConfiguration; diff --git a/typo3/sysext/saltedpasswords/Tests/Unit/Salt/SaltFactoryTest.php b/typo3/sysext/saltedpasswords/Tests/Unit/Salt/SaltFactoryTest.php index 642ed4182533d70ae00d08e414da7d9f99be92a6..d72c23e8eb5b2589d258deeb0891b12c78c75587 100644 --- a/typo3/sysext/saltedpasswords/Tests/Unit/Salt/SaltFactoryTest.php +++ b/typo3/sysext/saltedpasswords/Tests/Unit/Salt/SaltFactoryTest.php @@ -33,6 +33,21 @@ class SaltFactoryTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase */ protected function setUp() { + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['saltedpasswords'] = [ + 'BE' => [ + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + 'FE' => [ + 'enabled' => 1, + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + ]; $this->objectInstance = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance(); } diff --git a/typo3/sysext/saltedpasswords/Tests/Unit/Utility/SaltedPasswordsUtilityTest.php b/typo3/sysext/saltedpasswords/Tests/Unit/Utility/SaltedPasswordsUtilityTest.php deleted file mode 100644 index c44a3532fe11802eb2fd5413e92c759dcdd2b039..0000000000000000000000000000000000000000 --- a/typo3/sysext/saltedpasswords/Tests/Unit/Utility/SaltedPasswordsUtilityTest.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php -namespace TYPO3\CMS\Saltedpasswords\Tests\Unit\Utility; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -/** - * Testcase for SaltedPasswordsUtility - */ -class SaltedPasswordsUtilityTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase -{ - /** - * @test - */ - public function doesReturnExtConfReturnDefaultSettingsIfNoExtensionConfigurationIsFound() - { - $this->assertEquals(\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::returnExtConfDefaults(), \TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::returnExtConf('TEST_MODE')); - } - - /** - * @test - */ - public function doesReturnExtConfReturnMergedSettingsIfExtensionConfigurationIsFound() - { - $setting = ['setting' => 1]; - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['saltedpasswords'] = serialize(['TEST_MODE.' => $setting]); - $this->assertEquals(array_merge(\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::returnExtConfDefaults(), $setting), \TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::returnExtConf('TEST_MODE')); - } -} diff --git a/typo3/sysext/scheduler/Classes/Scheduler.php b/typo3/sysext/scheduler/Classes/Scheduler.php index e8428f878a9f5f3a9094f4a34be34fb326fbdf45..ae33ce6008dd0513bb32c187d90f02740c73494e 100644 --- a/typo3/sysext/scheduler/Classes/Scheduler.php +++ b/typo3/sysext/scheduler/Classes/Scheduler.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Scheduler; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\QueryHelper; @@ -39,7 +40,7 @@ class Scheduler implements \TYPO3\CMS\Core\SingletonInterface public function __construct() { // Get configuration from the extension manager - $this->extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['scheduler'], ['allowed_classes' => false]); + $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('scheduler'); if (empty($this->extConf['maxLifetime'])) { $this->extConf['maxLifetime'] = 1440; } diff --git a/typo3/sysext/scheduler/ext_localconf.php b/typo3/sysext/scheduler/ext_localconf.php index a8ec1ec7c4305e765ef52e25403106765f62c2a1..a52b690cf9be24be16661b0fee34f76e9e1db3e9 100644 --- a/typo3/sysext/scheduler/ext_localconf.php +++ b/typo3/sysext/scheduler/ext_localconf.php @@ -2,10 +2,12 @@ defined('TYPO3_MODE') or die(); // Get the extensions's configuration -$extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['scheduler'], ['allowed_classes' => false]); +$showSampleTasks = (bool)\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( + \TYPO3\CMS\Core\Configuration\ExtensionConfiguration::class +)->get('scheduler', 'showSampleTasks'); // If sample tasks should be shown, // register information for the test and sleep tasks -if (!empty($extConf['showSampleTasks'])) { +if ($showSampleTasks) { $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\TYPO3\CMS\Scheduler\Example\TestTask::class] = [ 'extension' => 'scheduler', 'title' => 'LLL:EXT:scheduler/Resources/Private/Language/locallang.xlf:testTask.name', @@ -19,6 +21,7 @@ if (!empty($extConf['showSampleTasks'])) { 'additionalFields' => \TYPO3\CMS\Scheduler\Example\SleepTaskAdditionalFieldProvider::class ]; } +unset($showSampleTasks); // Add caching framework garbage collection task $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\TYPO3\CMS\Scheduler\Task\CachingFrameworkGarbageCollectionTask::class] = [