From 7cdc97b58afe252d299074240e085ec095c25e4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Tue, 21 Apr 2015 17:11:43 +0200 Subject: [PATCH 001/127] Use PSR-4 and limit to PHP 5.4 as a minimum --- composer.json | 5 +- generate.php | 6 +- index.php | 4 +- libs/{daux.php => Daux.php} | 10 +- libs/{daux_helper.php => DauxHelper.php} | 71 +------- libs/{daux_directory.php => Entry.php} | 10 +- libs/ErrorPage.php | 48 ++++++ libs/MarkdownPage.php | 111 +++++++++++++ libs/Page.php | 7 + libs/SimplePage.php | 34 ++++ libs/daux_page.php | 200 ----------------------- templates/default/default.tpl | 4 +- templates/default/error.tpl | 4 +- vendor/composer/ClassLoader.php | 67 +++++++- vendor/composer/autoload_psr4.php | 1 + vendor/composer/autoload_real.php | 3 - 16 files changed, 282 insertions(+), 303 deletions(-) rename libs/{daux.php => Daux.php} (98%) rename libs/{daux_helper.php => DauxHelper.php} (81%) rename libs/{daux_directory.php => Entry.php} (96%) create mode 100644 libs/ErrorPage.php create mode 100644 libs/MarkdownPage.php create mode 100644 libs/Page.php create mode 100644 libs/SimplePage.php delete mode 100644 libs/daux_page.php diff --git a/composer.json b/composer.json index 933b1b1..e561988 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,10 @@ } ], "require": { - "php": ">=5.3", + "php": ">=5.4", "erusev/parsedown": "~1.0" + }, + "autoload": { + "psr-4": {"Todaymade\\Daux\\": "libs/"} } } diff --git a/generate.php b/generate.php index ab000c2..13afe2d 100644 --- a/generate.php +++ b/generate.php @@ -1,5 +1,5 @@ initialize(); if (isset($argv[2])) $Daux->generate_static($argv[2]); - else $Daux->generate_static(); -?> \ No newline at end of file + else $Daux->generate_static(); +?> diff --git a/index.php b/index.php index 9ace58f..bd3769f 100644 --- a/index.php +++ b/index.php @@ -1,5 +1,5 @@ initialize(); $page = $Daux->handle_request($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], $_REQUEST); $page->display(); -?> \ No newline at end of file +?> diff --git a/libs/daux.php b/libs/Daux.php similarity index 98% rename from libs/daux.php rename to libs/Daux.php index 78393eb..343cd87 100644 --- a/libs/daux.php +++ b/libs/Daux.php @@ -1,10 +1,4 @@ -', $base_url, $params['image']); if ($base_url !== '') $params['entry_page'] = $tree->first_page; foreach ($tree->value as $key => $node) { - if ($node->type === Directory_Entry::DIRECTORY_TYPE) { + if ($node->type === Entry::DIRECTORY_TYPE) { $new_output_dir = $output_dir . DIRECTORY_SEPARATOR . $key; @mkdir($new_output_dir); $this->recursive_generate_static($node, $new_output_dir, $new_params, '../' . $base_url); diff --git a/libs/daux_helper.php b/libs/DauxHelper.php similarity index 81% rename from libs/daux_helper.php rename to libs/DauxHelper.php index ece6258..3c7bee3 100644 --- a/libs/daux_helper.php +++ b/libs/DauxHelper.php @@ -1,5 +1,4 @@ -uri .= '.html'; } - if ($entry instanceof Directory_Entry) $node->value[$entry->uri] = $entry; + if ($entry instanceof Entry) $node->value[$entry->uri] = $entry; } $node->sort(); $node->first_page = $node->get_first_page(); @@ -299,65 +298,3 @@ EOT; } } - - if (!function_exists('http_response_code')) { - function http_response_code($code = NULL) { - - if ($code !== NULL) { - - switch ($code) { - case 100: $text = 'Continue'; break; - case 101: $text = 'Switching Protocols'; break; - case 200: $text = 'OK'; break; - case 201: $text = 'Created'; break; - case 202: $text = 'Accepted'; break; - case 203: $text = 'Non-Authoritative Information'; break; - case 204: $text = 'No Content'; break; - case 205: $text = 'Reset Content'; break; - case 206: $text = 'Partial Content'; break; - case 300: $text = 'Multiple Choices'; break; - case 301: $text = 'Moved Permanently'; break; - case 302: $text = 'Moved Temporarily'; break; - case 303: $text = 'See Other'; break; - case 304: $text = 'Not Modified'; break; - case 305: $text = 'Use Proxy'; break; - case 400: $text = 'Bad Request'; break; - case 401: $text = 'Unauthorized'; break; - case 402: $text = 'Payment Required'; break; - case 403: $text = 'Forbidden'; break; - case 404: $text = 'Not Found'; break; - case 405: $text = 'Method Not Allowed'; break; - case 406: $text = 'Not Acceptable'; break; - case 407: $text = 'Proxy Authentication Required'; break; - case 408: $text = 'Request Time-out'; break; - case 409: $text = 'Conflict'; break; - case 410: $text = 'Gone'; break; - case 411: $text = 'Length Required'; break; - case 412: $text = 'Precondition Failed'; break; - case 413: $text = 'Request Entity Too Large'; break; - case 414: $text = 'Request-URI Too Large'; break; - case 415: $text = 'Unsupported Media Type'; break; - case 500: $text = 'Internal Server Error'; break; - case 501: $text = 'Not Implemented'; break; - case 502: $text = 'Bad Gateway'; break; - case 503: $text = 'Service Unavailable'; break; - case 504: $text = 'Gateway Time-out'; break; - case 505: $text = 'HTTP Version not supported'; break; - default: - exit('Unknown http status code "' . htmlentities($code) . '"'); - break; - } - - $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0'); - header($protocol . ' ' . $code . ' ' . $text); - $GLOBALS['http_response_code'] = $code; - - } else { - $code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200); - } - return $code; - } - } - - -?> diff --git a/libs/daux_directory.php b/libs/Entry.php similarity index 96% rename from libs/daux_directory.php rename to libs/Entry.php index b39a2ef..c31d0b7 100644 --- a/libs/daux_directory.php +++ b/libs/Entry.php @@ -1,6 +1,5 @@ -uri = DauxHelper::get_url_from_filename($this->name); $this->index_page = false; if (is_dir($path)) { - $this->type = Directory_Entry::DIRECTORY_TYPE; + $this->type = Entry::DIRECTORY_TYPE; $this->value = array(); } else { - $this->type = Directory_Entry::FILE_TYPE; + $this->type = Entry::FILE_TYPE; $this->value = $this->uri; } } @@ -125,4 +124,3 @@ } } } -?> \ No newline at end of file diff --git a/libs/ErrorPage.php b/libs/ErrorPage.php new file mode 100644 index 0000000..4a15388 --- /dev/null +++ b/libs/ErrorPage.php @@ -0,0 +1,48 @@ +params = $params; + $this->type = $params['error_type']; + } + + public function display() { + http_response_code($this->type === static::MISSING_PAGE_ERROR_TYPE ? 404 : 500); + parent::display(); + } + + public function get_page_content() { + if ($this->type !== static::FATAL_ERROR_TYPE && is_null(static::$template)) { + include_once($this->params['theme']['error-template']); + static::$template = new Template(); + } + + if (is_null($this->html)) { + $this->html = $this->generate_page(); + } + + return $this->html; + } + + public function generate_page() { + if ($this->type === static::FATAL_ERROR_TYPE) return $this->content; + $params = $this->params; + $page['title'] = $this->title; + $page['theme'] = $params['theme']; + $page['content'] = $this->content; + $page['google_analytics'] = $params['google_analytics']; + $page['piwik_analytics'] = $params['piwik_analytics']; + + return static::$template->get_content($page, $params); + } +} diff --git a/libs/MarkdownPage.php b/libs/MarkdownPage.php new file mode 100644 index 0000000..bf3395d --- /dev/null +++ b/libs/MarkdownPage.php @@ -0,0 +1,111 @@ +initialize_from_file($file, $params); + return $instance; + } + + private function initialize_from_file($file, $params) { + $this->title = $file->title; + $this->filename = $file->name; + $this->path = $file->local_path; + $this->mtime = $file->last_modified; + $this->params = $params; + + if ($this->title === 'index') { + $this->homepage = ($this->filename === '_index'); + $minimum_parent_dir_size = ($params['multilanguage']) ? 2 : 1; + if (count($file->parents) >= $minimum_parent_dir_size) { + $parent = end($file->parents); + $this->title = $parent->title; + } else $this->title = $params['title']; + } else { + $this->homepage = false; + } + if ($params['breadcrumbs']) + $this->breadcrumb_trail = $this->build_breadcrumb_trail($file->parents, $params['multilanguage']); + $this->language = ''; + if ($params['multilanguage'] && !empty($file->parents)) { + reset($file->parents); + $language_dir = current($file->parents); + $this->language = $language_dir->name; + } + if (is_null(static::$template)) { + include_once($params['theme']['template']); + static::$template = new Template(); + } + } + + private function build_breadcrumb_trail($parents, $multilanguage) { + if ($multilanguage && !empty($parents)) $parents = array_splice($parents, 1); + $breadcrumb_trail = array(); + if (!empty($parents)) { + foreach ($parents as $node) { + $breadcrumb_trail[$node->title] = $node->get_url(); + } + } + return $breadcrumb_trail; + } + + public function get_page_content() { + if (is_null($this->html)) { + $this->content = file_get_contents($this->path); + $this->html = $this->generate_page(); + } + + return $this->html; + } + + private function generate_page() { + $params = $this->params; + $Parsedown = new \Parsedown(); + if ($params['request'] === $params['index_key']) { + if ($params['multilanguage']) { + foreach ($params['languages'] as $key => $name) { + $entry_page[utf8_encode($name)] = utf8_encode($params['base_page'] . $params['entry_page'][$key]->get_url()); + } + } else $entry_page['View Documentation'] = utf8_encode($params['base_page'] . $params['entry_page']->uri); + } else if ($params['file_uri'] === 'index') + $entry_page[utf8_encode($params['entry_page']->title)] = utf8_encode($params['base_page']. + $params['entry_page']->get_url()); + $page['entry_page'] = (isset($entry_page)) ? $entry_page : null; + + $page['homepage'] = $this->homepage; + $page['title'] = $this->title; + $page['tagline'] = $params['tagline']; + $page['author'] = $params['author']; + $page['filename'] = $this->filename; + if ($page['breadcrumbs'] = $params['breadcrumbs']) { + $page['breadcrumb_trail'] = $this->breadcrumb_trail; + $page['breadcrumb_separator'] = $params['breadcrumb_separator']; + } + $page['language'] = $this->language; + $page['path'] = $this->path; + $page['request'] = utf8_encode($params['request']); + $page['theme'] = $params['theme']; + $page['modified_time'] = filemtime($this->path); + $page['markdown'] = $this->content; + $page['content'] = $Parsedown->text($this->content); + $page['file_editor'] = $params['file_editor']; + $page['google_analytics'] = $params['google_analytics']; + $page['piwik_analytics'] = $params['piwik_analytics']; + + return static::$template->get_content($page, $params); + } +} diff --git a/libs/Page.php b/libs/Page.php new file mode 100644 index 0000000..d17b952 --- /dev/null +++ b/libs/Page.php @@ -0,0 +1,7 @@ +initialize_page($title, $content); + } + + public function initialize_page($title, $content) { + $this->title = $title; + $this->content = $content; + } + + public function display() { + header('Content-type: text/html; charset=utf-8'); + echo $this->get_page_content(); + } + + public function get_page_content() { + if (is_null($this->html)) { + $this->html = $this->generate_page(); + } + + return $this->html; + } + + private function generate_page() { + return $this->content; + } +} diff --git a/libs/daux_page.php b/libs/daux_page.php deleted file mode 100644 index 2b9dfbc..0000000 --- a/libs/daux_page.php +++ /dev/null @@ -1,200 +0,0 @@ -initialize_page($title, $content); - } - - public function initialize_page($title, $content) { - $this->title = $title; - $this->content = $content; - } - - public function display() { - header('Content-type: text/html; charset=utf-8'); - echo $this->get_page_content(); - } - - public function get_page_content() { - if (is_null($this->html)) { - $this->html = $this->generate_page(); - } - - return $this->html; - } - - private function generate_page() { - return $this->content; - } - } - - class ErrorPage extends SimplePage - { - const NORMAL_ERROR_TYPE = 'NORMAL_ERROR'; - const MISSING_PAGE_ERROR_TYPE = 'MISSING_PAGE_ERROR'; - const FATAL_ERROR_TYPE = 'FATAL_ERROR'; - - private $params; - private $type; - private static $template; - - public function __construct($title, $content, $params) { - parent::__construct($title, $content); - $this->params = $params; - $this->type = $params['error_type']; - } - - public function display() { - http_response_code($this->type === static::MISSING_PAGE_ERROR_TYPE ? 404 : 500); - parent::display(); - } - - public function get_page_content() { - if ($this->type !== static::FATAL_ERROR_TYPE && is_null(static::$template)) { - include_once($this->params['theme']['error-template']); - static::$template = new Template(); - } - - if (is_null($this->html)) { - $this->html = $this->generate_page(); - } - - return $this->html; - } - - public function generate_page() { - if ($this->type === static::FATAL_ERROR_TYPE) return $this->content; - $params = $this->params; - $page['title'] = $this->title; - $page['theme'] = $params['theme']; - $page['content'] = $this->content; - $page['google_analytics'] = $params['google_analytics']; - $page['piwik_analytics'] = $params['piwik_analytics']; - - return static::$template->get_content($page, $params); - } - } - - class MarkdownPage extends SimplePage - { - private $filename; - private $params; - private $language; - private $mtime; - private $homepage; - private $breadcrumb_trail; - private static $template; - - public function __construct() { - - } - - // For Future Expansion - public static function fromFile($file, $params) { - $instance = new self(); - $instance->initialize_from_file($file, $params); - return $instance; - } - - private function initialize_from_file($file, $params) { - $this->title = $file->title; - $this->filename = $file->name; - $this->path = $file->local_path; - $this->mtime = $file->last_modified; - $this->params = $params; - - if ($this->title === 'index') { - $this->homepage = ($this->filename === '_index'); - $minimum_parent_dir_size = ($params['multilanguage']) ? 2 : 1; - if (count($file->parents) >= $minimum_parent_dir_size) { - $parent = end($file->parents); - $this->title = $parent->title; - } else $this->title = $params['title']; - } else { - $this->homepage = false; - } - if ($params['breadcrumbs']) - $this->breadcrumb_trail = $this->build_breadcrumb_trail($file->parents, $params['multilanguage']); - $this->language = ''; - if ($params['multilanguage'] && !empty($file->parents)) { - reset($file->parents); - $language_dir = current($file->parents); - $this->language = $language_dir->name; - } - if (is_null(static::$template)) { - include_once($params['theme']['template']); - static::$template = new Template(); - } - } - - private function build_breadcrumb_trail($parents, $multilanguage) { - if ($multilanguage && !empty($parents)) $parents = array_splice($parents, 1); - $breadcrumb_trail = array(); - if (!empty($parents)) { - foreach ($parents as $node) { - $breadcrumb_trail[$node->title] = $node->get_url(); - } - } - return $breadcrumb_trail; - } - - public function get_page_content() { - if (is_null($this->html)) { - $this->content = file_get_contents($this->path); - $this->html = $this->generate_page(); - } - - return $this->html; - } - - private function generate_page() { - $params = $this->params; - $Parsedown = new \Parsedown(); - if ($params['request'] === $params['index_key']) { - if ($params['multilanguage']) { - foreach ($params['languages'] as $key => $name) { - $entry_page[utf8_encode($name)] = utf8_encode($params['base_page'] . $params['entry_page'][$key]->get_url()); - } - } else $entry_page['View Documentation'] = utf8_encode($params['base_page'] . $params['entry_page']->uri); - } else if ($params['file_uri'] === 'index') - $entry_page[utf8_encode($params['entry_page']->title)] = utf8_encode($params['base_page']. - $params['entry_page']->get_url()); - $page['entry_page'] = (isset($entry_page)) ? $entry_page : null; - - $page['homepage'] = $this->homepage; - $page['title'] = $this->title; - $page['tagline'] = $params['tagline']; - $page['author'] = $params['author']; - $page['filename'] = $this->filename; - if ($page['breadcrumbs'] = $params['breadcrumbs']) { - $page['breadcrumb_trail'] = $this->breadcrumb_trail; - $page['breadcrumb_separator'] = $params['breadcrumb_separator']; - } - $page['language'] = $this->language; - $page['path'] = $this->path; - $page['request'] = utf8_encode($params['request']); - $page['theme'] = $params['theme']; - $page['modified_time'] = filemtime($this->path); - $page['markdown'] = $this->content; - $page['content'] = $Parsedown->text($this->content); - $page['file_editor'] = $params['file_editor']; - $page['google_analytics'] = $params['google_analytics']; - $page['piwik_analytics'] = $params['piwik_analytics']; - - return static::$template->get_content($page, $params); - } - } - - ?> \ No newline at end of file diff --git a/templates/default/default.tpl b/templates/default/default.tpl index 147e8b3..f5c70f8 100644 --- a/templates/default/default.tpl +++ b/templates/default/default.tpl @@ -13,7 +13,7 @@ $nav = ''; foreach ($tree->value as $node) { $url = $node->uri; - if ($node->type === \TodayMade\Daux\Directory_Entry::FILE_TYPE) { + if ($node->type === \TodayMade\Daux\Entry::FILE_TYPE) { if ($node->value === 'index') continue; $nav .= ' \ No newline at end of file +?> diff --git a/templates/default/error.tpl b/templates/default/error.tpl index d05a0d0..0b31e51 100644 --- a/templates/default/error.tpl +++ b/templates/default/error.tpl @@ -12,7 +12,7 @@ private function build_navigation($tree, $path, $base_page) { $nav = ''; foreach ($tree->value as $url => $node) { - if ($node->type === \TodayMade\Daux\Directory_Entry::FILE_TYPE) { + if ($node->type === \TodayMade\Daux\Entry::FILE_TYPE) { if ($node->value === 'index') continue; $link = ($path === '') ? $url : $path . '/' . $url; $nav .= '
  • ' . $node->title . '
  • '; @@ -146,4 +146,4 @@ return $return; } } -?> \ No newline at end of file +?> diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php index 47ae2ee..5e1469e 100644 --- a/vendor/composer/ClassLoader.php +++ b/vendor/composer/ClassLoader.php @@ -54,9 +54,15 @@ class ClassLoader private $useIncludePath = false; private $classMap = array(); + private $classMapAuthoritative = false; + public function getPrefixes() { - return call_user_func_array('array_merge', $this->prefixesPsr0); + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); } public function getPrefixesPsr4() @@ -143,6 +149,8 @@ class ClassLoader * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-0 base directories * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException */ public function addPsr4($prefix, $paths, $prepend = false) { @@ -202,10 +210,13 @@ class ClassLoader * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException */ - public function setPsr4($prefix, $paths) { + public function setPsr4($prefix, $paths) + { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { @@ -239,6 +250,27 @@ class ClassLoader return $this->useIncludePath; } + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + /** * Registers this instance as an autoloader. * @@ -290,9 +322,29 @@ class ClassLoader if (isset($this->classMap[$class])) { return $this->classMap[$class]; } + if ($this->classMapAuthoritative) { + return false; + } + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if ($file === null && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if ($file === null) { + // Remember that this class does not exist. + return $this->classMap[$class] = false; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . '.php'; + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { @@ -321,7 +373,7 @@ class ClassLoader . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . '.php'; + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { @@ -347,9 +399,6 @@ class ClassLoader if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } - - // Remember that this class does not exist. - return $this->classMap[$class] = false; } } diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index b265c64..0b3843c 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -6,4 +6,5 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( + 'Todaymade\\Daux\\' => array($baseDir . '/libs'), ); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index a6e7514..b88bd72 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -23,9 +23,6 @@ class ComposerAutoloaderInit73a81d925b42f1d439aed1c696b3e22d self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInit73a81d925b42f1d439aed1c696b3e22d', 'loadClassLoader')); - $vendorDir = dirname(__DIR__); - $baseDir = dirname($vendorDir); - $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); From 90027b2a0e670a20fb079deb2f2a680b034d32d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Tue, 21 Apr 2015 17:34:43 +0200 Subject: [PATCH 002/127] Convention over configuration for themes --- Gruntfile.js | 12 ++++++------ img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes img/glyphicons-halflings.png | Bin 12799 -> 0 bytes libs/Daux.php | 6 +++--- .../themes/_common/less}/bootstrap/alerts.less | 0 .../themes/_common/less}/bootstrap/badges.less | 0 .../_common/less}/bootstrap/bootstrap.less | 0 .../_common/less}/bootstrap/breadcrumbs.less | 0 .../_common/less}/bootstrap/button-groups.less | 0 .../themes/_common/less}/bootstrap/buttons.less | 0 .../_common/less}/bootstrap/carousel.less | 0 .../themes/_common/less}/bootstrap/close.less | 0 .../themes/_common/less}/bootstrap/code.less | 0 .../less}/bootstrap/component-animations.less | 0 .../_common/less}/bootstrap/dropdowns.less | 0 .../themes/_common/less}/bootstrap/forms.less | 0 .../_common/less}/bootstrap/glyphicons.less | 0 .../themes/_common/less}/bootstrap/grid.less | 0 .../_common/less}/bootstrap/input-groups.less | 0 .../_common/less}/bootstrap/jumbotron.less | 0 .../themes/_common/less}/bootstrap/labels.less | 0 .../_common/less}/bootstrap/list-group.less | 0 .../themes/_common/less}/bootstrap/media.less | 0 .../themes/_common/less}/bootstrap/mixins.less | 0 .../_common/less}/bootstrap/mixins/alerts.less | 0 .../bootstrap/mixins/background-variant.less | 0 .../less}/bootstrap/mixins/border-radius.less | 0 .../_common/less}/bootstrap/mixins/buttons.less | 0 .../less}/bootstrap/mixins/center-block.less | 0 .../less}/bootstrap/mixins/clearfix.less | 0 .../_common/less}/bootstrap/mixins/forms.less | 0 .../less}/bootstrap/mixins/gradients.less | 0 .../less}/bootstrap/mixins/grid-framework.less | 0 .../_common/less}/bootstrap/mixins/grid.less | 0 .../less}/bootstrap/mixins/hide-text.less | 0 .../_common/less}/bootstrap/mixins/image.less | 0 .../_common/less}/bootstrap/mixins/labels.less | 0 .../less}/bootstrap/mixins/list-group.less | 0 .../less}/bootstrap/mixins/nav-divider.less | 0 .../bootstrap/mixins/nav-vertical-align.less | 0 .../_common/less}/bootstrap/mixins/opacity.less | 0 .../less}/bootstrap/mixins/pagination.less | 0 .../_common/less}/bootstrap/mixins/panels.less | 0 .../less}/bootstrap/mixins/progress-bar.less | 0 .../less}/bootstrap/mixins/reset-filter.less | 0 .../_common/less}/bootstrap/mixins/resize.less | 0 .../bootstrap/mixins/responsive-visibility.less | 0 .../_common/less}/bootstrap/mixins/size.less | 0 .../less}/bootstrap/mixins/tab-focus.less | 0 .../less}/bootstrap/mixins/table-row.less | 0 .../less}/bootstrap/mixins/text-emphasis.less | 0 .../less}/bootstrap/mixins/text-overflow.less | 0 .../less}/bootstrap/mixins/vendor-prefixes.less | 0 .../themes/_common/less}/bootstrap/modals.less | 0 .../themes/_common/less}/bootstrap/navbar.less | 0 .../themes/_common/less}/bootstrap/navs.less | 0 .../_common/less}/bootstrap/normalize.less | 0 .../themes/_common/less}/bootstrap/pager.less | 0 .../_common/less}/bootstrap/pagination.less | 0 .../themes/_common/less}/bootstrap/panels.less | 0 .../_common/less}/bootstrap/popovers.less | 0 .../themes/_common/less}/bootstrap/print.less | 0 .../_common/less}/bootstrap/progress-bars.less | 0 .../less}/bootstrap/responsive-embed.less | 0 .../less}/bootstrap/responsive-utilities.less | 0 .../_common/less}/bootstrap/scaffolding.less | 0 .../themes/_common/less}/bootstrap/tables.less | 0 .../themes/_common/less}/bootstrap/theme.less | 0 .../_common/less}/bootstrap/thumbnails.less | 0 .../themes/_common/less}/bootstrap/tooltip.less | 0 .../themes/_common/less}/bootstrap/type.less | 0 .../_common/less}/bootstrap/utilities.less | 0 .../_common/less}/bootstrap/variables.less | 0 .../themes/_common/less}/bootstrap/wells.less | 0 .../themes/_common/less}/components.less | 0 .../default/themes/_common/less}/daux-base.less | 0 .../default/themes/_common/less}/highlight.less | 0 .../default/themes/_common/less}/mixins.less | 0 .../default/themes/_common/less}/structure.less | 0 .../default/themes/_common/less}/tools.less | 0 .../{daux-blue.thm => daux-blue/config.json} | 4 ++-- .../css/theme.min.css} | 2 +- .../default/themes/daux-blue/less/theme.less | 2 +- .../{daux-green.thm => daux-green/config.json} | 4 ++-- .../css/theme.min.css} | 2 +- .../default/themes/daux-green/less/theme.less | 2 +- .../{daux-navy.thm => daux-navy/config.json} | 4 ++-- .../css/theme.min.css} | 2 +- .../default/themes/daux-navy/less/theme.less | 2 +- .../{daux-red.thm => daux-red/config.json} | 4 ++-- .../css/theme.min.css} | 2 +- .../default/themes/daux-red/less/theme.less | 2 +- 92 files changed, 25 insertions(+), 25 deletions(-) delete mode 100755 img/glyphicons-halflings-white.png delete mode 100755 img/glyphicons-halflings.png rename {less/import => templates/default/themes/_common/less}/bootstrap/alerts.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/badges.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/bootstrap.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/breadcrumbs.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/button-groups.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/buttons.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/carousel.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/close.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/code.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/component-animations.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/dropdowns.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/forms.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/glyphicons.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/grid.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/input-groups.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/jumbotron.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/labels.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/list-group.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/media.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/alerts.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/background-variant.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/border-radius.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/buttons.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/center-block.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/clearfix.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/forms.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/gradients.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/grid-framework.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/grid.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/hide-text.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/image.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/labels.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/list-group.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/nav-divider.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/nav-vertical-align.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/opacity.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/pagination.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/panels.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/progress-bar.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/reset-filter.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/resize.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/responsive-visibility.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/size.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/tab-focus.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/table-row.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/text-emphasis.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/text-overflow.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/mixins/vendor-prefixes.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/modals.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/navbar.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/navs.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/normalize.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/pager.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/pagination.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/panels.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/popovers.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/print.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/progress-bars.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/responsive-embed.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/responsive-utilities.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/scaffolding.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/tables.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/theme.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/thumbnails.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/tooltip.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/type.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/utilities.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/variables.less (100%) rename {less/import => templates/default/themes/_common/less}/bootstrap/wells.less (100%) rename {less/import => templates/default/themes/_common/less}/components.less (100%) rename {less/import => templates/default/themes/_common/less}/daux-base.less (100%) rename {less/import => templates/default/themes/_common/less}/highlight.less (100%) rename {less/import => templates/default/themes/_common/less}/mixins.less (100%) rename {less/import => templates/default/themes/_common/less}/structure.less (100%) rename {less/import => templates/default/themes/_common/less}/tools.less (100%) rename templates/default/themes/{daux-blue.thm => daux-blue/config.json} (83%) rename templates/default/themes/{daux-green/css/daux-green.css => daux-blue/css/theme.min.css} (88%) rename less/daux-blue.less => templates/default/themes/daux-blue/less/theme.less (84%) rename templates/default/themes/{daux-green.thm => daux-green/config.json} (83%) rename templates/default/themes/{daux-navy/css/daux-navy.css => daux-green/css/theme.min.css} (80%) rename less/daux-green.less => templates/default/themes/daux-green/less/theme.less (84%) rename templates/default/themes/{daux-navy.thm => daux-navy/config.json} (83%) rename templates/default/themes/{daux-red/css/daux-red.css => daux-navy/css/theme.min.css} (83%) rename less/daux-navy.less => templates/default/themes/daux-navy/less/theme.less (84%) rename templates/default/themes/{daux-red.thm => daux-red/config.json} (83%) rename templates/default/themes/{daux-blue/css/daux-blue.css => daux-red/css/theme.min.css} (80%) rename less/daux-red.less => templates/default/themes/daux-red/less/theme.less (84%) diff --git a/Gruntfile.js b/Gruntfile.js index 64e57d9..3971702 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -22,16 +22,16 @@ module.exports = function (grunt) { report: 'min' }, files: { - "css/daux-blue.min.css": "less/daux-blue.less", - "css/daux-green.min.css": "less/daux-green.less", - "css/daux-navy.min.css": "less/daux-navy.less", - "css/daux-red.min.css": "less/daux-red.less" + "templates/default/themes/daux-blue/css/theme.min.css": "templates/default/themes/daux-blue/less/theme.less", + "templates/default/themes/daux-green/css/theme.min.css": "templates/default/themes/daux-green/less/theme.less", + "templates/default/themes/daux-navy/css/theme.min.css": "templates/default/themes/daux-navy/less/theme.less", + "templates/default/themes/daux-red/css/theme.min.css": "templates/default/themes/daux-red/less/theme.less" } } }, watch: { scripts: { - files: ['less/**/*.less'], + files: ['templates/default/theme/**/*.less'], tasks: ['less'], options: { nospawn: true @@ -42,4 +42,4 @@ module.exports = function (grunt) { //grunt.registerTask('default', ['less', 'watch']); grunt.registerTask('default', ['php']); -}; \ No newline at end of file +}; diff --git a/img/glyphicons-halflings-white.png b/img/glyphicons-halflings-white.png deleted file mode 100755 index 3bf6484a29d8da269f9bc874b25493a45fae3bae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8777 zcmZvC1yGz#v+m*$LXcp=A$ZWB0fL7wNbp_U*$~{_gL`my3oP#L!5tQYy99Ta`+g_q zKlj|KJ2f@c)ARJx{q*bbkhN_!|Wn*Vos8{TEhUT@5e;_WJsIMMcG5%>DiS&dv_N`4@J0cnAQ-#>RjZ z00W5t&tJ^l-QC*ST1-p~00u^9XJ=AUl7oW-;2a+x2k__T=grN{+1c4XK0ZL~^z^i$ zp&>vEhr@4fZWb380S18T&!0cQ3IKpHF)?v=b_NIm0Q>vwY7D0baZ)n z31Fa5sELUQARIVaU0nqf0XzT+fB_63aA;@<$l~wse|mcA;^G1TmX?-)e)jkGPfkuA z92@|!<>h5S_4f8QP-JRq>d&7)^Yin8l7K8gED$&_FaV?gY+wLjpoW%~7NDe=nHfMG z5DO3j{R9kv5GbssrUpO)OyvVrlx>u0UKD0i;Dpm5S5dY16(DL5l{ixz|mhJU@&-OWCTb7_%}8-fE(P~+XIRO zJU|wp1|S>|J3KrLcz^+v1f&BDpd>&MAaibR4#5A_4(MucZwG9E1h4@u0P@C8;oo+g zIVj7kfJi{oV~E(NZ*h(@^-(Q(C`Psb3KZ{N;^GB(a8NE*Vwc715!9 zr-H4Ao|T_c6+VT_JH9H+P3>iXSt!a$F`>s`jn`w9GZ_~B!{0soaiV|O_c^R2aWa%}O3jUE)WO=pa zs~_Wz08z|ieY5A%$@FcBF9^!1a}m5ks@7gjn;67N>}S~Hrm`4sM5Hh`q7&5-N{|31 z6x1{ol7BnskoViZ0GqbLa#kW`Z)VCjt1MysKg|rT zi!?s##Ck>8c zpi|>$lGlw#@yMNi&V4`6OBGJ(H&7lqLlcTQ&1zWriG_fL>BnFcr~?;E93{M-xIozQ zO=EHQ#+?<}%@wbWWv23#!V70h9MOuUVaU>3kpTvYfc|LBw?&b*89~Gc9i&8tlT#kF ztpbZoAzkdB+UTy=tx%L3Z4)I{zY(Kb)eg{InobSJmNwPZt$14aS-uc4eKuY8h$dtfyxu^a%zA)>fYI&)@ZXky?^{5>xSC?;w4r&td6vBdi%vHm4=XJH!3yL3?Ep+T5aU_>i;yr_XGq zxZfCzUU@GvnoIk+_Nd`aky>S&H!b*{A%L>?*XPAgWL(Vf(k7qUS}>Zn=U(ZfcOc{B z3*tOHH@t5Ub5D~#N7!Fxx}P2)sy{vE_l(R7$aW&CX>c|&HY+7};vUIietK%}!phrCuh+;C@1usp;XLU<8Gq8P!rEI3ieg#W$!= zQcZr{hp>8sF?k&Yl0?B84OneiQxef-4TEFrq3O~JAZR}yEJHA|Xkqd49tR&8oq{zP zY@>J^HBV*(gJvJZc_0VFN7Sx?H7#75E3#?N8Z!C+_f53YU}pyggxx1?wQi5Yb-_`I`_V*SMx5+*P^b=ec5RON-k1cIlsBLk}(HiaJyab0`CI zo0{=1_LO$~oE2%Tl_}KURuX<`+mQN_sTdM&* zkFf!Xtl^e^gTy6ON=&gTn6)$JHQq2)33R@_!#9?BLNq-Wi{U|rVX7Vny$l6#+SZ@KvQt@VYb%<9JfapI^b9j=wa+Tqb4ei;8c5 z&1>Uz@lVFv6T4Z*YU$r4G`g=91lSeA<=GRZ!*KTWKDPR}NPUW%peCUj`Ix_LDq!8| zMH-V`Pv!a~QkTL||L@cqiTz)*G-0=ytr1KqTuFPan9y4gYD5>PleK`NZB$ev@W%t= zkp)_=lBUTLZJpAtZg;pjI;7r2y|26-N7&a(hX|`1YNM9N8{>8JAuv}hp1v`3JHT-=5lbXpbMq7X~2J5Kl zh7tyU`_AusMFZ{ej9D;Uyy;SQ!4nwgSnngsYBwdS&EO3NS*o04)*juAYl;57c2Ly0(DEZ8IY?zSph-kyxu+D`tt@oU{32J#I{vmy=#0ySPK zA+i(A3yl)qmTz*$dZi#y9FS;$;h%bY+;StNx{_R56Otq+?pGe^T^{5d7Gs&?`_r`8 zD&dzOA|j8@3A&FR5U3*eQNBf<4^4W_iS_()*8b4aaUzfk2 zzIcMWSEjm;EPZPk{j{1>oXd}pXAj!NaRm8{Sjz!D=~q3WJ@vmt6ND_?HI~|wUS1j5 z9!S1MKr7%nxoJ3k`GB^7yV~*{n~O~n6($~x5Bu{7s|JyXbAyKI4+tO(zZYMslK;Zc zzeHGVl{`iP@jfSKq>R;{+djJ9n%$%EL()Uw+sykjNQdflkJZSjqV_QDWivbZS~S{K zkE@T^Jcv)Dfm93!mf$XYnCT--_A$zo9MOkPB6&diM8MwOfV?+ApNv`moV@nqn>&lv zYbN1-M|jc~sG|yLN^1R2=`+1ih3jCshg`iP&mY$GMTcY^W^T`WOCX!{-KHmZ#GiRH zYl{|+KLn5!PCLtBy~9i}`#d^gCDDx$+GQb~uc;V#K3OgbbOG0j5{BRG-si%Bo{@lB zGIt+Ain8^C`!*S0d0OSWVO+Z89}}O8aFTZ>p&k}2gGCV zh#<$gswePFxWGT$4DC^8@84_e*^KT74?7n8!$8cg=sL$OlKr&HMh@Rr5%*Wr!xoOl zo7jItnj-xYgVTX)H1=A2bD(tleEH57#V{xAeW_ezISg5OC zg=k>hOLA^urTH_e6*vSYRqCm$J{xo}-x3@HH;bsHD1Z`Pzvsn}%cvfw%Q(}h`Dgtb z0_J^niUmoCM5$*f)6}}qi(u;cPgxfyeVaaVmOsG<)5`6tzU4wyhF;k|~|x>7-2hXpVBpc5k{L4M`Wbe6Q?tr^*B z`Y*>6*&R#~%JlBIitlZ^qGe3s21~h3U|&k%%jeMM;6!~UH|+0+<5V-_zDqZQN79?n?!Aj!Nj`YMO9?j>uqI9-Tex+nJD z%e0#Yca6(zqGUR|KITa?9x-#C0!JKJHO(+fy@1!B$%ZwJwncQW7vGYv?~!^`#L~Um zOL++>4qmqW`0Chc0T23G8|vO)tK=Z2`gvS4*qpqhIJCEv9i&&$09VO8YOz|oZ+ubd zNXVdLc&p=KsSgtmIPLN69P7xYkYQ1vJ?u1g)T!6Ru`k2wkdj*wDC)VryGu2=yb0?F z>q~~e>KZ0d_#7f3UgV%9MY1}vMgF{B8yfE{HL*pMyhYF)WDZ^^3vS8F zGlOhs%g_~pS3=WQ#494@jAXwOtr^Y|TnQ5zki>qRG)(oPY*f}U_=ip_{qB0!%w7~G zWE!P4p3khyW-JJnE>eECuYfI?^d366Shq!Wm#x&jAo>=HdCllE$>DPO0N;y#4G)D2y#B@5=N=+F%Xo2n{gKcPcK2!hP*^WSXl+ut; zyLvVoY>VL{H%Kd9^i~lsb8j4>$EllrparEOJNT?Ym>vJa$(P^tOG)5aVb_5w^*&M0 zYOJ`I`}9}UoSnYg#E(&yyK(tqr^@n}qU2H2DhkK-`2He% zgXr_4kpXoQHxAO9S`wEdmqGU4j=1JdG!OixdqB4PPP6RXA}>GM zumruUUH|ZG2$bBj)Qluj&uB=dRb)?^qomw?Z$X%#D+Q*O97eHrgVB2*mR$bFBU`*} zIem?dM)i}raTFDn@5^caxE^XFXVhBePmH9fqcTi`TLaXiueH=@06sl}>F%}h9H_e9 z>^O?LxM1EjX}NVppaO@NNQr=AtHcH-BU{yBT_vejJ#J)l^cl69Z7$sk`82Zyw7Wxt z=~J?hZm{f@W}|96FUJfy65Gk8?^{^yjhOahUMCNNpt5DJw}ZKH7b!bGiFY9y6OY&T z_N)?Jj(MuLTN36ZCJ6I5Xy7uVlrb$o*Z%=-)kPo9s?<^Yqz~!Z* z_mP8(unFq65XSi!$@YtieSQ!<7IEOaA9VkKI?lA`*(nURvfKL8cX}-+~uw9|_5)uC2`ZHcaeX7L8aG6Ghleg@F9aG%X$#g6^yP5apnB>YTz&EfS{q z9UVfSyEIczebC)qlVu5cOoMzS_jrC|)rQlAzK7sfiW0`M8mVIohazPE9Jzn*qPt%6 zZL8RELY@L09B83@Be;x5V-IHnn$}{RAT#<2JA%ttlk#^(%u}CGze|1JY5MPhbfnYG zIw%$XfBmA-<_pKLpGKwbRF$#P;@_)ech#>vj25sv25VM$ouo)?BXdRcO{)*OwTw)G zv43W~T6ekBMtUD%5Bm>`^Ltv!w4~65N!Ut5twl!Agrzyq4O2Fi3pUMtCU~>9gt_=h-f% z;1&OuSu?A_sJvIvQ+dZNo3?m1%b1+s&UAx?8sUHEe_sB7zkm4R%6)<@oYB_i5>3Ip zIA+?jVdX|zL{)?TGpx+=Ta>G80}0}Ax+722$XFNJsC1gcH56{8B)*)eU#r~HrC&}` z|EWW92&;6y;3}!L5zXa385@?-D%>dSvyK;?jqU2t_R3wvBW;$!j45uQ7tyEIQva;Db}r&bR3kqNSh)Q_$MJ#Uj3Gj1F;)sO|%6z#@<+ zi{pbYsYS#u`X$Nf($OS+lhw>xgjos1OnF^$-I$u;qhJswhH~p|ab*nO>zBrtb0ndn zxV0uh!LN`&xckTP+JW}gznSpU492)u+`f{9Yr)js`NmfYH#Wdtradc0TnKNz@Su!e zu$9}G_=ku;%4xk}eXl>)KgpuT>_<`Ud(A^a++K&pm3LbN;gI}ku@YVrA%FJBZ5$;m zobR8}OLtW4-i+qPPLS-(7<>M{)rhiPoi@?&vDeVq5%fmZk=mDdRV>Pb-l7pP1y6|J z8I>sF+TypKV=_^NwBU^>4JJq<*14GLfM2*XQzYdlqqjnE)gZsPW^E@mp&ww* zW9i>XL=uwLVZ9pO*8K>t>vdL~Ek_NUL$?LQi5sc#1Q-f6-ywKcIT8Kw?C(_3pbR`e|)%9S-({if|E+hR2W!&qfQ&UiF^I!|M#xhdWsenv^wpKCBiuxXbnp85`{i|;BM?Ba`lqTA zyRm=UWJl&E{8JzYDHFu>*Z10-?#A8D|5jW9Ho0*CAs0fAy~MqbwYuOq9jjt9*nuHI zbDwKvh)5Ir$r!fS5|;?Dt>V+@F*v8=TJJF)TdnC#Mk>+tGDGCw;A~^PC`gUt*<(|i zB{{g{`uFehu`$fm4)&k7`u{xIV)yvA(%5SxX9MS80p2EKnLtCZ>tlX>*Z6nd&6-Mv$5rHD*db;&IBK3KH&M<+ArlGXDRdX1VVO4)&R$f4NxXI>GBh zSv|h>5GDAI(4E`@F?EnW zS>#c&Gw6~_XL`qQG4bK`W*>hek4LX*efn6|_MY+rXkNyAuu?NxS%L7~9tD3cn7&p( zCtfqe6sjB&Q-Vs7BP5+%;#Gk};4xtwU!KY0XXbmkUy$kR9)!~?*v)qw00!+Yg^#H> zc#8*z6zZo>+(bud?K<*!QO4ehiTCK&PD4G&n)Tr9X_3r-we z?fI+}-G~Yn93gI6F{}Dw_SC*FLZ)5(85zp4%uubtD)J)UELLkvGk4#tw&Tussa)mTD$R2&O~{ zCI3>fr-!-b@EGRI%g0L8UU%%u_<;e9439JNV;4KSxd|78v+I+8^rmMf3f40Jb}wEszROD?xBZu>Ll3;sUIoNxDK3|j3*sam2tC@@e$ z^!;+AK>efeBJB%ALsQ{uFui)oDoq()2USi?n=6C3#eetz?wPswc={I<8x=(8lE4EIsUfyGNZ{|KYn1IR|=E==f z(;!A5(-2y^2xRFCSPqzHAZn5RCN_bp22T(KEtjA(rFZ%>a4@STrHZflxKoqe9Z4@^ zM*scx_y73?Q{vt6?~WEl?2q*;@8 z3M*&@%l)SQmXkcUm)d@GT2#JdzhfSAP9|n#C;$E8X|pwD!r#X?0P>0ZisQ~TNqupW z*lUY~+ikD`vQb?@SAWX#r*Y+;=_|oacL$2CL$^(mV}aKO77pg}O+-=T1oLBT5sL2i z42Qth2+0@C`c+*D0*5!qy26sis<9a7>LN2{z%Qj49t z=L@x`4$ALHb*3COHoT?5S_c(Hs}g!V>W^=6Q0}zaubkDn)(lTax0+!+%B}9Vqw6{H zvL|BRM`O<@;eVi1DzM!tXtBrA20Ce@^Jz|>%X-t`vi-%WweXCh_LhI#bUg2*pcP~R z*RuTUzBKLXO~~uMd&o$v3@d0shHfUjC6c539PE6rF&;Ufa(Rw@K1*m7?f5)t`MjH0 z)_V(cajV5Am>f!kWcI@5rE8t6$S>5M=k=aRZROH6fA^jJp~2NlR4;Q2>L$7F#RT#9 z>4@1RhWG`Khy>P2j1Yx^BBL{S`niMaxlSWV-JBU0-T9zZ%>7mR3l$~QV$({o0;jTI ze5=cN^!Bc2bT|BcojXp~K#2cM>OTe*cM{Kg-j*CkiW)EGQot^}s;cy8_1_@JA0Whq zlrNr+R;Efa+`6N)s5rH*|E)nYZ3uqkk2C(E7@A|3YI`ozP~9Lexx#*1(r8luq+YPk z{J}c$s` zPM35Fx(YWB3Z5IYnN+L_4|jaR(5iWJi2~l&xy}aU7kW?o-V*6Av2wyZTG!E2KSW2* zGRLQkQU;Oz##ie-Z4fI)WSRxn$(ZcD;TL+;^r=a4(G~H3ZhK$lSXZj?cvyY8%d9JM zzc3#pD^W_QnWy#rx#;c&N@sqHhrnHRmj#i;s%zLm6SE(n&BWpd&f7>XnjV}OlZntI70fq%8~9<7 zMYaw`E-rp49-oC1N_uZTo)Cu%RR2QWdHpzQIcNsoDp`3xfP+`gI?tVQZ4X={qU?(n zV>0ASES^Xuc;9JBji{)RnFL(Lez;8XbB1uWaMp@p?7xhXk6V#!6B@aP4Rz7-K%a>i z?fvf}va_DGUXlI#4--`A3qK7J?-HwnG7O~H2;zR~RLW)_^#La!=}+>KW#anZ{|^D3 B7G?kd diff --git a/img/glyphicons-halflings.png b/img/glyphicons-halflings.png deleted file mode 100755 index a9969993201f9cee63cf9f49217646347297b643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12799 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 diff --git a/libs/Daux.php b/libs/Daux.php index 343cd87..dccd143 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -227,7 +227,7 @@ $params['template'] = $this->options['template']; $params['theme'] = DauxHelper::configure_theme($this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . - $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'] . '.thm', $params['base_url'], + $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'] . '/config.json', $params['base_url'], $this->local_base, $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/'); break; @@ -257,7 +257,7 @@ $params['template'] = $this->options['template']; $params['theme'] = DauxHelper::configure_theme($this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . - $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'] . '.thm', $params['base_url'], + $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'] . '/config.json', $params['base_url'], $this->local_base, $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/', $mode); @@ -301,7 +301,7 @@ $params['template'] = $this->options['template']; $params['theme'] = DauxHelper::configure_theme($this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . - $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'] . '.thm', $params['base_url'], + $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'] . '/config.json', $params['base_url'], $this->local_base, $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/', $mode); if ($params['breadcrumbs'] = $this->options['breadcrumbs']) diff --git a/less/import/bootstrap/alerts.less b/templates/default/themes/_common/less/bootstrap/alerts.less similarity index 100% rename from less/import/bootstrap/alerts.less rename to templates/default/themes/_common/less/bootstrap/alerts.less diff --git a/less/import/bootstrap/badges.less b/templates/default/themes/_common/less/bootstrap/badges.less similarity index 100% rename from less/import/bootstrap/badges.less rename to templates/default/themes/_common/less/bootstrap/badges.less diff --git a/less/import/bootstrap/bootstrap.less b/templates/default/themes/_common/less/bootstrap/bootstrap.less similarity index 100% rename from less/import/bootstrap/bootstrap.less rename to templates/default/themes/_common/less/bootstrap/bootstrap.less diff --git a/less/import/bootstrap/breadcrumbs.less b/templates/default/themes/_common/less/bootstrap/breadcrumbs.less similarity index 100% rename from less/import/bootstrap/breadcrumbs.less rename to templates/default/themes/_common/less/bootstrap/breadcrumbs.less diff --git a/less/import/bootstrap/button-groups.less b/templates/default/themes/_common/less/bootstrap/button-groups.less similarity index 100% rename from less/import/bootstrap/button-groups.less rename to templates/default/themes/_common/less/bootstrap/button-groups.less diff --git a/less/import/bootstrap/buttons.less b/templates/default/themes/_common/less/bootstrap/buttons.less similarity index 100% rename from less/import/bootstrap/buttons.less rename to templates/default/themes/_common/less/bootstrap/buttons.less diff --git a/less/import/bootstrap/carousel.less b/templates/default/themes/_common/less/bootstrap/carousel.less similarity index 100% rename from less/import/bootstrap/carousel.less rename to templates/default/themes/_common/less/bootstrap/carousel.less diff --git a/less/import/bootstrap/close.less b/templates/default/themes/_common/less/bootstrap/close.less similarity index 100% rename from less/import/bootstrap/close.less rename to templates/default/themes/_common/less/bootstrap/close.less diff --git a/less/import/bootstrap/code.less b/templates/default/themes/_common/less/bootstrap/code.less similarity index 100% rename from less/import/bootstrap/code.less rename to templates/default/themes/_common/less/bootstrap/code.less diff --git a/less/import/bootstrap/component-animations.less b/templates/default/themes/_common/less/bootstrap/component-animations.less similarity index 100% rename from less/import/bootstrap/component-animations.less rename to templates/default/themes/_common/less/bootstrap/component-animations.less diff --git a/less/import/bootstrap/dropdowns.less b/templates/default/themes/_common/less/bootstrap/dropdowns.less similarity index 100% rename from less/import/bootstrap/dropdowns.less rename to templates/default/themes/_common/less/bootstrap/dropdowns.less diff --git a/less/import/bootstrap/forms.less b/templates/default/themes/_common/less/bootstrap/forms.less similarity index 100% rename from less/import/bootstrap/forms.less rename to templates/default/themes/_common/less/bootstrap/forms.less diff --git a/less/import/bootstrap/glyphicons.less b/templates/default/themes/_common/less/bootstrap/glyphicons.less similarity index 100% rename from less/import/bootstrap/glyphicons.less rename to templates/default/themes/_common/less/bootstrap/glyphicons.less diff --git a/less/import/bootstrap/grid.less b/templates/default/themes/_common/less/bootstrap/grid.less similarity index 100% rename from less/import/bootstrap/grid.less rename to templates/default/themes/_common/less/bootstrap/grid.less diff --git a/less/import/bootstrap/input-groups.less b/templates/default/themes/_common/less/bootstrap/input-groups.less similarity index 100% rename from less/import/bootstrap/input-groups.less rename to templates/default/themes/_common/less/bootstrap/input-groups.less diff --git a/less/import/bootstrap/jumbotron.less b/templates/default/themes/_common/less/bootstrap/jumbotron.less similarity index 100% rename from less/import/bootstrap/jumbotron.less rename to templates/default/themes/_common/less/bootstrap/jumbotron.less diff --git a/less/import/bootstrap/labels.less b/templates/default/themes/_common/less/bootstrap/labels.less similarity index 100% rename from less/import/bootstrap/labels.less rename to templates/default/themes/_common/less/bootstrap/labels.less diff --git a/less/import/bootstrap/list-group.less b/templates/default/themes/_common/less/bootstrap/list-group.less similarity index 100% rename from less/import/bootstrap/list-group.less rename to templates/default/themes/_common/less/bootstrap/list-group.less diff --git a/less/import/bootstrap/media.less b/templates/default/themes/_common/less/bootstrap/media.less similarity index 100% rename from less/import/bootstrap/media.less rename to templates/default/themes/_common/less/bootstrap/media.less diff --git a/less/import/bootstrap/mixins.less b/templates/default/themes/_common/less/bootstrap/mixins.less similarity index 100% rename from less/import/bootstrap/mixins.less rename to templates/default/themes/_common/less/bootstrap/mixins.less diff --git a/less/import/bootstrap/mixins/alerts.less b/templates/default/themes/_common/less/bootstrap/mixins/alerts.less similarity index 100% rename from less/import/bootstrap/mixins/alerts.less rename to templates/default/themes/_common/less/bootstrap/mixins/alerts.less diff --git a/less/import/bootstrap/mixins/background-variant.less b/templates/default/themes/_common/less/bootstrap/mixins/background-variant.less similarity index 100% rename from less/import/bootstrap/mixins/background-variant.less rename to templates/default/themes/_common/less/bootstrap/mixins/background-variant.less diff --git a/less/import/bootstrap/mixins/border-radius.less b/templates/default/themes/_common/less/bootstrap/mixins/border-radius.less similarity index 100% rename from less/import/bootstrap/mixins/border-radius.less rename to templates/default/themes/_common/less/bootstrap/mixins/border-radius.less diff --git a/less/import/bootstrap/mixins/buttons.less b/templates/default/themes/_common/less/bootstrap/mixins/buttons.less similarity index 100% rename from less/import/bootstrap/mixins/buttons.less rename to templates/default/themes/_common/less/bootstrap/mixins/buttons.less diff --git a/less/import/bootstrap/mixins/center-block.less b/templates/default/themes/_common/less/bootstrap/mixins/center-block.less similarity index 100% rename from less/import/bootstrap/mixins/center-block.less rename to templates/default/themes/_common/less/bootstrap/mixins/center-block.less diff --git a/less/import/bootstrap/mixins/clearfix.less b/templates/default/themes/_common/less/bootstrap/mixins/clearfix.less similarity index 100% rename from less/import/bootstrap/mixins/clearfix.less rename to templates/default/themes/_common/less/bootstrap/mixins/clearfix.less diff --git a/less/import/bootstrap/mixins/forms.less b/templates/default/themes/_common/less/bootstrap/mixins/forms.less similarity index 100% rename from less/import/bootstrap/mixins/forms.less rename to templates/default/themes/_common/less/bootstrap/mixins/forms.less diff --git a/less/import/bootstrap/mixins/gradients.less b/templates/default/themes/_common/less/bootstrap/mixins/gradients.less similarity index 100% rename from less/import/bootstrap/mixins/gradients.less rename to templates/default/themes/_common/less/bootstrap/mixins/gradients.less diff --git a/less/import/bootstrap/mixins/grid-framework.less b/templates/default/themes/_common/less/bootstrap/mixins/grid-framework.less similarity index 100% rename from less/import/bootstrap/mixins/grid-framework.less rename to templates/default/themes/_common/less/bootstrap/mixins/grid-framework.less diff --git a/less/import/bootstrap/mixins/grid.less b/templates/default/themes/_common/less/bootstrap/mixins/grid.less similarity index 100% rename from less/import/bootstrap/mixins/grid.less rename to templates/default/themes/_common/less/bootstrap/mixins/grid.less diff --git a/less/import/bootstrap/mixins/hide-text.less b/templates/default/themes/_common/less/bootstrap/mixins/hide-text.less similarity index 100% rename from less/import/bootstrap/mixins/hide-text.less rename to templates/default/themes/_common/less/bootstrap/mixins/hide-text.less diff --git a/less/import/bootstrap/mixins/image.less b/templates/default/themes/_common/less/bootstrap/mixins/image.less similarity index 100% rename from less/import/bootstrap/mixins/image.less rename to templates/default/themes/_common/less/bootstrap/mixins/image.less diff --git a/less/import/bootstrap/mixins/labels.less b/templates/default/themes/_common/less/bootstrap/mixins/labels.less similarity index 100% rename from less/import/bootstrap/mixins/labels.less rename to templates/default/themes/_common/less/bootstrap/mixins/labels.less diff --git a/less/import/bootstrap/mixins/list-group.less b/templates/default/themes/_common/less/bootstrap/mixins/list-group.less similarity index 100% rename from less/import/bootstrap/mixins/list-group.less rename to templates/default/themes/_common/less/bootstrap/mixins/list-group.less diff --git a/less/import/bootstrap/mixins/nav-divider.less b/templates/default/themes/_common/less/bootstrap/mixins/nav-divider.less similarity index 100% rename from less/import/bootstrap/mixins/nav-divider.less rename to templates/default/themes/_common/less/bootstrap/mixins/nav-divider.less diff --git a/less/import/bootstrap/mixins/nav-vertical-align.less b/templates/default/themes/_common/less/bootstrap/mixins/nav-vertical-align.less similarity index 100% rename from less/import/bootstrap/mixins/nav-vertical-align.less rename to templates/default/themes/_common/less/bootstrap/mixins/nav-vertical-align.less diff --git a/less/import/bootstrap/mixins/opacity.less b/templates/default/themes/_common/less/bootstrap/mixins/opacity.less similarity index 100% rename from less/import/bootstrap/mixins/opacity.less rename to templates/default/themes/_common/less/bootstrap/mixins/opacity.less diff --git a/less/import/bootstrap/mixins/pagination.less b/templates/default/themes/_common/less/bootstrap/mixins/pagination.less similarity index 100% rename from less/import/bootstrap/mixins/pagination.less rename to templates/default/themes/_common/less/bootstrap/mixins/pagination.less diff --git a/less/import/bootstrap/mixins/panels.less b/templates/default/themes/_common/less/bootstrap/mixins/panels.less similarity index 100% rename from less/import/bootstrap/mixins/panels.less rename to templates/default/themes/_common/less/bootstrap/mixins/panels.less diff --git a/less/import/bootstrap/mixins/progress-bar.less b/templates/default/themes/_common/less/bootstrap/mixins/progress-bar.less similarity index 100% rename from less/import/bootstrap/mixins/progress-bar.less rename to templates/default/themes/_common/less/bootstrap/mixins/progress-bar.less diff --git a/less/import/bootstrap/mixins/reset-filter.less b/templates/default/themes/_common/less/bootstrap/mixins/reset-filter.less similarity index 100% rename from less/import/bootstrap/mixins/reset-filter.less rename to templates/default/themes/_common/less/bootstrap/mixins/reset-filter.less diff --git a/less/import/bootstrap/mixins/resize.less b/templates/default/themes/_common/less/bootstrap/mixins/resize.less similarity index 100% rename from less/import/bootstrap/mixins/resize.less rename to templates/default/themes/_common/less/bootstrap/mixins/resize.less diff --git a/less/import/bootstrap/mixins/responsive-visibility.less b/templates/default/themes/_common/less/bootstrap/mixins/responsive-visibility.less similarity index 100% rename from less/import/bootstrap/mixins/responsive-visibility.less rename to templates/default/themes/_common/less/bootstrap/mixins/responsive-visibility.less diff --git a/less/import/bootstrap/mixins/size.less b/templates/default/themes/_common/less/bootstrap/mixins/size.less similarity index 100% rename from less/import/bootstrap/mixins/size.less rename to templates/default/themes/_common/less/bootstrap/mixins/size.less diff --git a/less/import/bootstrap/mixins/tab-focus.less b/templates/default/themes/_common/less/bootstrap/mixins/tab-focus.less similarity index 100% rename from less/import/bootstrap/mixins/tab-focus.less rename to templates/default/themes/_common/less/bootstrap/mixins/tab-focus.less diff --git a/less/import/bootstrap/mixins/table-row.less b/templates/default/themes/_common/less/bootstrap/mixins/table-row.less similarity index 100% rename from less/import/bootstrap/mixins/table-row.less rename to templates/default/themes/_common/less/bootstrap/mixins/table-row.less diff --git a/less/import/bootstrap/mixins/text-emphasis.less b/templates/default/themes/_common/less/bootstrap/mixins/text-emphasis.less similarity index 100% rename from less/import/bootstrap/mixins/text-emphasis.less rename to templates/default/themes/_common/less/bootstrap/mixins/text-emphasis.less diff --git a/less/import/bootstrap/mixins/text-overflow.less b/templates/default/themes/_common/less/bootstrap/mixins/text-overflow.less similarity index 100% rename from less/import/bootstrap/mixins/text-overflow.less rename to templates/default/themes/_common/less/bootstrap/mixins/text-overflow.less diff --git a/less/import/bootstrap/mixins/vendor-prefixes.less b/templates/default/themes/_common/less/bootstrap/mixins/vendor-prefixes.less similarity index 100% rename from less/import/bootstrap/mixins/vendor-prefixes.less rename to templates/default/themes/_common/less/bootstrap/mixins/vendor-prefixes.less diff --git a/less/import/bootstrap/modals.less b/templates/default/themes/_common/less/bootstrap/modals.less similarity index 100% rename from less/import/bootstrap/modals.less rename to templates/default/themes/_common/less/bootstrap/modals.less diff --git a/less/import/bootstrap/navbar.less b/templates/default/themes/_common/less/bootstrap/navbar.less similarity index 100% rename from less/import/bootstrap/navbar.less rename to templates/default/themes/_common/less/bootstrap/navbar.less diff --git a/less/import/bootstrap/navs.less b/templates/default/themes/_common/less/bootstrap/navs.less similarity index 100% rename from less/import/bootstrap/navs.less rename to templates/default/themes/_common/less/bootstrap/navs.less diff --git a/less/import/bootstrap/normalize.less b/templates/default/themes/_common/less/bootstrap/normalize.less similarity index 100% rename from less/import/bootstrap/normalize.less rename to templates/default/themes/_common/less/bootstrap/normalize.less diff --git a/less/import/bootstrap/pager.less b/templates/default/themes/_common/less/bootstrap/pager.less similarity index 100% rename from less/import/bootstrap/pager.less rename to templates/default/themes/_common/less/bootstrap/pager.less diff --git a/less/import/bootstrap/pagination.less b/templates/default/themes/_common/less/bootstrap/pagination.less similarity index 100% rename from less/import/bootstrap/pagination.less rename to templates/default/themes/_common/less/bootstrap/pagination.less diff --git a/less/import/bootstrap/panels.less b/templates/default/themes/_common/less/bootstrap/panels.less similarity index 100% rename from less/import/bootstrap/panels.less rename to templates/default/themes/_common/less/bootstrap/panels.less diff --git a/less/import/bootstrap/popovers.less b/templates/default/themes/_common/less/bootstrap/popovers.less similarity index 100% rename from less/import/bootstrap/popovers.less rename to templates/default/themes/_common/less/bootstrap/popovers.less diff --git a/less/import/bootstrap/print.less b/templates/default/themes/_common/less/bootstrap/print.less similarity index 100% rename from less/import/bootstrap/print.less rename to templates/default/themes/_common/less/bootstrap/print.less diff --git a/less/import/bootstrap/progress-bars.less b/templates/default/themes/_common/less/bootstrap/progress-bars.less similarity index 100% rename from less/import/bootstrap/progress-bars.less rename to templates/default/themes/_common/less/bootstrap/progress-bars.less diff --git a/less/import/bootstrap/responsive-embed.less b/templates/default/themes/_common/less/bootstrap/responsive-embed.less similarity index 100% rename from less/import/bootstrap/responsive-embed.less rename to templates/default/themes/_common/less/bootstrap/responsive-embed.less diff --git a/less/import/bootstrap/responsive-utilities.less b/templates/default/themes/_common/less/bootstrap/responsive-utilities.less similarity index 100% rename from less/import/bootstrap/responsive-utilities.less rename to templates/default/themes/_common/less/bootstrap/responsive-utilities.less diff --git a/less/import/bootstrap/scaffolding.less b/templates/default/themes/_common/less/bootstrap/scaffolding.less similarity index 100% rename from less/import/bootstrap/scaffolding.less rename to templates/default/themes/_common/less/bootstrap/scaffolding.less diff --git a/less/import/bootstrap/tables.less b/templates/default/themes/_common/less/bootstrap/tables.less similarity index 100% rename from less/import/bootstrap/tables.less rename to templates/default/themes/_common/less/bootstrap/tables.less diff --git a/less/import/bootstrap/theme.less b/templates/default/themes/_common/less/bootstrap/theme.less similarity index 100% rename from less/import/bootstrap/theme.less rename to templates/default/themes/_common/less/bootstrap/theme.less diff --git a/less/import/bootstrap/thumbnails.less b/templates/default/themes/_common/less/bootstrap/thumbnails.less similarity index 100% rename from less/import/bootstrap/thumbnails.less rename to templates/default/themes/_common/less/bootstrap/thumbnails.less diff --git a/less/import/bootstrap/tooltip.less b/templates/default/themes/_common/less/bootstrap/tooltip.less similarity index 100% rename from less/import/bootstrap/tooltip.less rename to templates/default/themes/_common/less/bootstrap/tooltip.less diff --git a/less/import/bootstrap/type.less b/templates/default/themes/_common/less/bootstrap/type.less similarity index 100% rename from less/import/bootstrap/type.less rename to templates/default/themes/_common/less/bootstrap/type.less diff --git a/less/import/bootstrap/utilities.less b/templates/default/themes/_common/less/bootstrap/utilities.less similarity index 100% rename from less/import/bootstrap/utilities.less rename to templates/default/themes/_common/less/bootstrap/utilities.less diff --git a/less/import/bootstrap/variables.less b/templates/default/themes/_common/less/bootstrap/variables.less similarity index 100% rename from less/import/bootstrap/variables.less rename to templates/default/themes/_common/less/bootstrap/variables.less diff --git a/less/import/bootstrap/wells.less b/templates/default/themes/_common/less/bootstrap/wells.less similarity index 100% rename from less/import/bootstrap/wells.less rename to templates/default/themes/_common/less/bootstrap/wells.less diff --git a/less/import/components.less b/templates/default/themes/_common/less/components.less similarity index 100% rename from less/import/components.less rename to templates/default/themes/_common/less/components.less diff --git a/less/import/daux-base.less b/templates/default/themes/_common/less/daux-base.less similarity index 100% rename from less/import/daux-base.less rename to templates/default/themes/_common/less/daux-base.less diff --git a/less/import/highlight.less b/templates/default/themes/_common/less/highlight.less similarity index 100% rename from less/import/highlight.less rename to templates/default/themes/_common/less/highlight.less diff --git a/less/import/mixins.less b/templates/default/themes/_common/less/mixins.less similarity index 100% rename from less/import/mixins.less rename to templates/default/themes/_common/less/mixins.less diff --git a/less/import/structure.less b/templates/default/themes/_common/less/structure.less similarity index 100% rename from less/import/structure.less rename to templates/default/themes/_common/less/structure.less diff --git a/less/import/tools.less b/templates/default/themes/_common/less/tools.less similarity index 100% rename from less/import/tools.less rename to templates/default/themes/_common/less/tools.less diff --git a/templates/default/themes/daux-blue.thm b/templates/default/themes/daux-blue/config.json similarity index 83% rename from templates/default/themes/daux-blue.thm rename to templates/default/themes/daux-blue/config.json index 0ccd2ba..67968d8 100644 --- a/templates/default/themes/daux-blue.thm +++ b/templates/default/themes/daux-blue/config.json @@ -1,8 +1,8 @@ { "favicon": "img/favicon-blue.png", - "css": ["css/daux-blue.css"], + "css": ["css/theme.min.css"], "fonts": ["//fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700&subset=latin,cyrillic-ext,cyrillic"], "js": [], "require-jquery": true, "bootstrap-js": false -} \ No newline at end of file +} diff --git a/templates/default/themes/daux-green/css/daux-green.css b/templates/default/themes/daux-blue/css/theme.min.css similarity index 88% rename from templates/default/themes/daux-green/css/daux-green.css rename to templates/default/themes/daux-blue/css/theme.min.css index bd6579f..0c85aa0 100644 --- a/templates/default/themes/daux-green/css/daux-green.css +++ b/templates/default/themes/daux-blue/css/theme.min.css @@ -2,4 +2,4 @@ * DAUX.IO * http://daux.io/ * MIT License - *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */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,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:0 0}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{-moz-box-sizing:content-box;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;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;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}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;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:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-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:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.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}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}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,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}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:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;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}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled,.homepage-footer.container-fluid .footer-nav{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:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}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:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}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}@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}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.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-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);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;-o-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:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@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 .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@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:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.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 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.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{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.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}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#969696}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);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:6px}.well-sm{padding:9px;border-radius:3px}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after{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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.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}tr.visible-sm{display:table-row!important}th.visible-sm,td.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}tr.visible-md{display:table-row!important}th.visible-md,td.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}tr.visible-lg{display:table-row!important}th.visible-lg,td.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}tr.visible-print{display:table-row!important}th.visible-print,td.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}}.roboto-slab.light{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:100}.roboto-slab.book{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}.roboto-slab.regular{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.roboto-slab.bold{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}h1,h2,h3,h4,h5,h6{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}pre{padding:0}.homepage-hero{padding-top:60px!important;background-color:#8acc37;box-shadow:none;border-radius:0;border:none;color:#000;overflow:hidden;padding-bottom:0;margin-bottom:0}.homepage-hero .text-center{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;margin:10px 0}.homepage-hero h2{margin:20px 0}.hero-buttons.container-fluid{padding:20px 0;background-color:#a0d55d}.hero-buttons.container-fluid .btn-hero.btn{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;padding:20px 30px;background-image:none;filter:none;box-shadow:none;border-radius:0;text-shadow:none;border:none;opacity:.8;filter:alpha(opacity=80);margin:0 10px;text-transform:uppercase;border:5px solid #000}@media (max-width:767px){.hero-buttons.container-fluid .btn-hero.btn{display:block;margin-bottom:10px}}.hero-buttons.container-fluid .btn-hero.btn:hover{opacity:1;filter:alpha(opacity=100)}.hero-buttons.container-fluid .btn-hero.btn.btn-secondary{background-color:#a0d55d;color:#000}.hero-buttons.container-fluid .btn-hero.btn.btn-primary{background-color:#000;color:#f5f5f6}.homepage-content.container-fluid{background-color:#fff;padding:40px 0}.homepage-content.container-fluid .lead{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.homepage-content.container-fluid ul,.homepage-content.container-fluid ol{padding:20px 0;margin:0 0 10px}.homepage-content.container-fluid ul li,.homepage-content.container-fluid ol li{list-style:none;padding-bottom:5px}.homepage-content.container-fluid ul li:before,.homepage-content.container-fluid ol li:before{content:'';width:0;height:0;border:3px solid transparent;border-left:3px solid #8acc37;float:left;display:block;margin:6px}@media (max-width:767px){.homepage-content.container-fluid{padding:40px 20px}}.homepage-footer.container-fluid{background-color:#000;box-shadow:none;border-radius:0;color:light;border:none}@media (max-width:767px){.homepage-footer.container-fluid{padding:0 20px}}.homepage-footer.container-fluid .footer-nav{margin:40px 0}.homepage-footer.container-fluid .footer-nav li a{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;font-size:16px;line-height:32px}.homepage-footer.container-fluid .footer-nav li a:hover{color:#8acc37;text-decoration:underline}.homepage-footer.container-fluid .twitter{margin-top:20px}.homepage-footer.container-fluid .twitter:first-child{margin-top:40px}html,body{margin:0;padding:0;height:100%;background-color:#8acc37;color:#2d2d2d}.container-fluid.fluid-height{height:100%}.columns{height:100%;padding-top:50px}.columns .left-column{background-color:#f5f5f6;border-right:1px solid #e7e7e9;overflow-x:hidden}.columns .right-column .content-page{padding:20px;min-height:100%;background-color:#fff}.content-area,.article-tree{overflow:auto;padding:0}@media (min-width:767px){.content-area,.article-tree{height:100%}}.responsive-collapse{padding:10px 15px;display:none;background-color:#e7e7e9;border-bottom:1px solid #e7e7e9}@media (max-width:767px){.responsive-collapse{display:block}}@media (max-width:768px){.sub-nav-collapse{display:none}}@media (min-width:768px){.sub-nav-collapse{display:block}}@media only screen and (max-width:800px){table,thead,tbody,th,td,tr{display:block;border:none}thead tr{position:absolute;top:-9999px;left:-9999px}tr{margin-bottom:10px;border-bottom:2px solid #ccc}tr td,tr th{border:1px solid #ccc;border-bottom:none}td{border:none;border-bottom:1px solid #eee;position:relative;padding-left:50%!important;white-space:normal;text-align:left}td:before{position:absolute;top:6px;left:6px;width:45%;padding-right:10px;white-space:nowrap;text-align:left;font-weight:700}td:before{content:attr(data-title)}}a{color:#8acc37}.btn.btn-sidebar{padding:7px 10px;background-image:none;filter:none;box-shadow:none;background-color:#a0d55d;border:none}.btn.btn-sidebar .icon-bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#000;box-shadow:none}.btn.btn-sidebar:hover{box-shadow:none;background-color:#000}.btn.btn-sidebar:hover .icon-bar{background-color:#8acc37;box-shadow:none}code{color:#8acc37}.navbar{box-shadow:0 1px 5px rgba(0,0,0,.25);background-color:#000;margin-bottom:0;z-index:200}.navbar .container,.navbar .container-fluid{background-image:none;filter:none;border-bottom:none;padding:0 20px}.navbar .container .brand,.navbar .container-fluid .brand{color:#8acc37;text-shadow:none;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}.navbar .container .navbar-text,.navbar .container-fluid .navbar-text{color:#8acc37}.navbar .container .navbar-text a,.navbar .container-fluid .navbar-text a{color:#8acc37}@media (min-width:768px) and (max-width:979px){.navbar.navbar-fixed-top{position:fixed}}@media (max-width:767px){.navbar.navbar-fixed-top{margin-left:0;margin-right:0}}.nav.nav-list{padding-left:0;padding-right:0}.nav.nav-list li a{margin:0;padding:6px 15px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#000;font-size:15px;text-shadow:none;border-color:#e7e7e9}.nav.nav-list li a:hover{color:#000;text-shadow:none;background-color:#a0d55d}.nav.nav-list li.active a{background-color:#a0d55d}.nav.nav-list li.open>ul{display:block}.nav.nav-list li ul{display:none;margin-left:15px}.nav.nav-list li ul li a{font-weight:400;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:20px;margin:0;margin-left:-15px;padding:3px 30px;border:none;color:#2d2d2d;opacity:.7;filter:alpha(opacity=70)}.nav.nav-list li ul li a:hover{opacity:1;filter:alpha(opacity=100);background-color:transparent}.nav.nav-list li ul li.active a{color:#000}.page-header{margin:10px 0;padding:0}.page-header h1{margin-top:0}.page-header sub-heading{padding:0,0,20px}pre{border:none;background-color:#8acc37;border-radius:0;padding:10px;margin-left:-20px;padding-left:30px;margin-right:-20px;padding-right:30px}pre code{background:0 0;border:none}@media (min-width:1150px){.float-view .content-page{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.float-view .content-page article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.float-view .content-page article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.float-view .content-page table{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff;white-space:normal}.float-view .content-page table pre,.float-view .content-page table code{white-space:normal}.float-view .content-page .page-header{padding:0}.float-view .content-page .page-header,.float-view .content-page blockquote,.float-view .content-page p,.float-view .content-page ul,.float-view .content-page ol,.float-view .content-page dl,.float-view .content-page h2,.float-view .content-page h3,.float-view .content-page h4,.float-view .content-page h5,.float-view .content-page h6{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff}.float-view .content-page .page-header:before,.float-view .content-page blockquote:before,.float-view .content-page p:before,.float-view .content-page ul:before,.float-view .content-page ol:before,.float-view .content-page dl:before,.float-view .content-page h2:before,.float-view .content-page h3:before,.float-view .content-page h4:before,.float-view .content-page h5:before,.float-view .content-page h6:before{width:100%;height:10px;display:block;clear:both}.float-view .content-page .page-header p,.float-view .content-page blockquote p,.float-view .content-page p p,.float-view .content-page ul p,.float-view .content-page ol p,.float-view .content-page dl p,.float-view .content-page h2 p,.float-view .content-page h3 p,.float-view .content-page h4 p,.float-view .content-page h5 p,.float-view .content-page h6 p,.float-view .content-page .page-header ul,.float-view .content-page blockquote ul,.float-view .content-page p ul,.float-view .content-page ul ul,.float-view .content-page ol ul,.float-view .content-page dl ul,.float-view .content-page h2 ul,.float-view .content-page h3 ul,.float-view .content-page h4 ul,.float-view .content-page h5 ul,.float-view .content-page h6 ul,.float-view .content-page .page-header ol,.float-view .content-page blockquote ol,.float-view .content-page p ol,.float-view .content-page ul ol,.float-view .content-page ol ol,.float-view .content-page dl ol,.float-view .content-page h2 ol,.float-view .content-page h3 ol,.float-view .content-page h4 ol,.float-view .content-page h5 ol,.float-view .content-page h6 ol,.float-view .content-page .page-header dl,.float-view .content-page blockquote dl,.float-view .content-page p dl,.float-view .content-page ul dl,.float-view .content-page ol dl,.float-view .content-page dl dl,.float-view .content-page h2 dl,.float-view .content-page h3 dl,.float-view .content-page h4 dl,.float-view .content-page h5 dl,.float-view .content-page h6 dl,.float-view .content-page .page-header h2,.float-view .content-page blockquote h2,.float-view .content-page p h2,.float-view .content-page ul h2,.float-view .content-page ol h2,.float-view .content-page dl h2,.float-view .content-page h2 h2,.float-view .content-page h3 h2,.float-view .content-page h4 h2,.float-view .content-page h5 h2,.float-view .content-page h6 h2,.float-view .content-page .page-header h3,.float-view .content-page blockquote h3,.float-view .content-page p h3,.float-view .content-page ul h3,.float-view .content-page ol h3,.float-view .content-page dl h3,.float-view .content-page h2 h3,.float-view .content-page h3 h3,.float-view .content-page h4 h3,.float-view .content-page h5 h3,.float-view .content-page h6 h3,.float-view .content-page .page-header h4,.float-view .content-page blockquote h4,.float-view .content-page p h4,.float-view .content-page ul h4,.float-view .content-page ol h4,.float-view .content-page dl h4,.float-view .content-page h2 h4,.float-view .content-page h3 h4,.float-view .content-page h4 h4,.float-view .content-page h5 h4,.float-view .content-page h6 h4,.float-view .content-page .page-header h5,.float-view .content-page blockquote h5,.float-view .content-page p h5,.float-view .content-page ul h5,.float-view .content-page ol h5,.float-view .content-page dl h5,.float-view .content-page h2 h5,.float-view .content-page h3 h5,.float-view .content-page h4 h5,.float-view .content-page h5 h5,.float-view .content-page h6 h5,.float-view .content-page .page-header h6,.float-view .content-page blockquote h6,.float-view .content-page p h6,.float-view .content-page ul h6,.float-view .content-page ol h6,.float-view .content-page dl h6,.float-view .content-page h2 h6,.float-view .content-page h3 h6,.float-view .content-page h4 h6,.float-view .content-page h5 h6,.float-view .content-page h6 h6,.float-view .content-page .page-header pre,.float-view .content-page blockquote pre,.float-view .content-page p pre,.float-view .content-page ul pre,.float-view .content-page ol pre,.float-view .content-page dl pre,.float-view .content-page h2 pre,.float-view .content-page h3 pre,.float-view .content-page h4 pre,.float-view .content-page h5 pre,.float-view .content-page h6 pre{float:none;display:block}.float-view .content-page ul li,.float-view .content-page ol li{margin-left:30px}.float-view .content-page pre{float:left;clear:right;width:47%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0 0 0 10px}}table{width:100%;border-bottom:1px solid #e7e7e9;margin-bottom:10px}table tr th,table tr td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #e7e7e9;border-left:1px solid #e7e7e9;border-color:#e7e7e9!important}table tr th:last-child,table tr td:last-child{border-right:1px solid #e7e7e9}.footer{position:fixed;bottom:0;left:0;padding:15px}#github-ribbon{position:absolute;top:50px;right:0;z-index:200}.well.well-sidebar{box-shadow:none;background-color:transparent;border-radius:0;border:none}.well.well-sidebar a{font-size:13px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#8acc37;line-height:28px}.well.well-sidebar .twitter hr{border-bottom:none;margin-left:-20px;margin-right:-20px}.editor{position:absolute;top:0;left:0;right:0;background:#fff;padding:20px;padding-bottom:100px;min-height:100%;height:auto;display:none}.editor h3{width:100%!important}.editor.paddingTop{padding-top:50px}#markdown_editor{width:85%;margin:0 auto;padding:10px;height:auto;font-size:16px;min-height:100px;font-family:"Ubuntu Mono",Consolas,monospace;display:block}.hljs{display:block;padding:.5em}.hljs,.hljs-subst,.hljs-tag .hljs-title,.hljs-lisp .hljs-title,.hljs-clojure .hljs-built_in,.hljs-nginx .hljs-title{color:#000}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value,.hljs-rules .hljs-value .hljs-number,.hljs-preprocessor,.hljs-ruby .hljs-symbol,.hljs-ruby .hljs-symbol .hljs-string,.hljs-aggregate,.hljs-template_tag,.hljs-django .hljs-variable,.hljs-smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-apache .hljs-cbracket,.hljs-tex .hljs-command,.hljs-tex .hljs-special,.hljs-erlang_repl .hljs-function_or_atom,.hljs-markdown .hljs-header{color:#e0ff00}.hljs-comment,.hljs-annotation,.hljs-template_comment,.hljs-diff .hljs-header,.hljs-chunk,.hljs-markdown .hljs-blockquote{color:#c4e598}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-smalltalk .hljs-symbol,.hljs-smalltalk .hljs-char,.hljs-go .hljs-constant,.hljs-change,.hljs-markdown .hljs-bullet,.hljs-markdown .hljs-link_url{color:#097c4e}.hljs-label,.hljs-javadoc,.hljs-ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.hljs-apache .hljs-sqbracket,.hljs-nginx .hljs-built_in,.hljs-tex .hljs-formula,.hljs-erlang_repl .hljs-reserved,.hljs-prompt,.hljs-markdown .hljs-link_label,.hljs-vhdl .hljs-attribute,.hljs-clojure .hljs-attribute,.hljs-coffeescript .hljs-property{color:#022e99}.hljs-keyword,.hljs-id,.hljs-phpdoc,.hljs-title,.hljs-built_in,.hljs-aggregate,.hljs-css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-yardoctag,.hljs-smalltalk .hljs-class,.hljs-winutils,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-go .hljs-typename,.hljs-tex .hljs-command,.hljs-markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:700}.hljs-markdown .hljs-emphasis{font-style:italic}.hljs-nginx .hljs-built_in{font-weight:400}.hljs-coffeescript .hljs-javascript,.hljs-javascript .hljs-xml,.hljs-tex .hljs-formula,.hljs-xml .hljs-javascript,.hljs-xml .hljs-vbscript,.hljs-xml .hljs-css,.hljs-xml .hljs-cdata{opacity:.5} \ No newline at end of file + *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */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,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:0 0}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{-moz-box-sizing:content-box;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;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;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}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;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:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-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:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.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}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}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,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}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:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;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}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled,.homepage-footer.container-fluid .footer-nav{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:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}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:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}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}@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}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.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-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);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;-o-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:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@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 .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@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:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.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 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.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{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.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}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#969696}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);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:6px}.well-sm{padding:9px;border-radius:3px}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after{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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.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}tr.visible-sm{display:table-row!important}th.visible-sm,td.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}tr.visible-md{display:table-row!important}th.visible-md,td.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}tr.visible-lg{display:table-row!important}th.visible-lg,td.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}tr.visible-print{display:table-row!important}th.visible-print,td.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}}.roboto-slab.light{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:100}.roboto-slab.book{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}.roboto-slab.regular{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.roboto-slab.bold{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}h1,h2,h3,h4,h5,h6{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}pre{padding:0}.homepage-hero{padding-top:60px!important;background-color:#82becd;box-shadow:none;border-radius:0;border:0;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0}.homepage-hero .text-center{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;margin:10px 0}.homepage-hero h2{margin:20px 0}.hero-buttons.container-fluid{padding:20px 0;background-color:#c5c5cb}.hero-buttons.container-fluid .btn-hero.btn{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;padding:20px 30px;background-image:none;filter:none;box-shadow:none;border-radius:0;text-shadow:none;border:0;opacity:.8;filter:alpha(opacity=80);margin:0 10px;text-transform:uppercase;border:5px solid #3f4657}@media (max-width:767px){.hero-buttons.container-fluid .btn-hero.btn{display:block;margin-bottom:10px}}.hero-buttons.container-fluid .btn-hero.btn:hover{opacity:1;filter:alpha(opacity=100)}.hero-buttons.container-fluid .btn-hero.btn.btn-secondary{background-color:#c5c5cb;color:#3f4657}.hero-buttons.container-fluid .btn-hero.btn.btn-primary{background-color:#3f4657;color:#f7f7f7}.homepage-content.container-fluid{background-color:#fff;padding:40px 0}.homepage-content.container-fluid .lead{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.homepage-content.container-fluid ul,.homepage-content.container-fluid ol{padding:20px 0;margin:0 0 10px}.homepage-content.container-fluid ul li,.homepage-content.container-fluid ol li{list-style:none;padding-bottom:5px}.homepage-content.container-fluid ul li:before,.homepage-content.container-fluid ol li:before{content:'';width:0;height:0;border:3px solid transparent;border-left:3px solid #82becd;float:left;display:block;margin:6px}@media (max-width:767px){.homepage-content.container-fluid{padding:40px 20px}}.homepage-footer.container-fluid{background-color:#3f4657;box-shadow:none;border-radius:0;color:light;border:0}@media (max-width:767px){.homepage-footer.container-fluid{padding:0 20px}}.homepage-footer.container-fluid .footer-nav{margin:40px 0}.homepage-footer.container-fluid .footer-nav li a{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;font-size:16px;line-height:32px}.homepage-footer.container-fluid .footer-nav li a:hover{color:#82becd;text-decoration:underline}.homepage-footer.container-fluid .twitter{margin-top:20px}.homepage-footer.container-fluid .twitter:first-child{margin-top:40px}html,body{margin:0;padding:0;height:100%;background-color:#82becd;color:#2d2d2d}.container-fluid.fluid-height{height:100%}.columns{height:100%;padding-top:50px}.columns .left-column{background-color:#f7f7f7;border-right:1px solid #e7e7e9;overflow-x:hidden}.columns .right-column .content-page{padding:20px;min-height:100%;background-color:#fff}.content-area,.article-tree{overflow:auto;padding:0}@media (min-width:767px){.content-area,.article-tree{height:100%}}.responsive-collapse{padding:10px 15px;display:none;background-color:#e7e7e9;border-bottom:1px solid #e7e7e9}@media (max-width:767px){.responsive-collapse{display:block}}@media (max-width:768px){.sub-nav-collapse{display:none}}@media (min-width:768px){.sub-nav-collapse{display:block}}@media only screen and (max-width:800px){table,thead,tbody,th,td,tr{display:block;border:0}thead tr{position:absolute;top:-9999px;left:-9999px}tr{margin-bottom:10px;border-bottom:2px solid #ccc}tr td,tr th{border:1px solid #ccc;border-bottom:0}td{border:0;border-bottom:1px solid #eee;position:relative;padding-left:50%!important;white-space:normal;text-align:left}td:before{position:absolute;top:6px;left:6px;width:45%;padding-right:10px;white-space:nowrap;text-align:left;font-weight:700}td:before{content:attr(data-title)}}a{color:#82becd}.btn.btn-sidebar{padding:7px 10px;background-image:none;filter:none;box-shadow:none;background-color:#c5c5cb;border:0}.btn.btn-sidebar .icon-bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#3f4657;box-shadow:none}.btn.btn-sidebar:hover{box-shadow:none;background-color:#3f4657}.btn.btn-sidebar:hover .icon-bar{background-color:#82becd;box-shadow:none}code{color:#82becd}.navbar{box-shadow:0 1px 5px rgba(0,0,0,.25);background-color:#3f4657;margin-bottom:0;z-index:200}.navbar .container,.navbar .container-fluid{background-image:none;filter:none;border-bottom:0;padding:0 20px}.navbar .container .brand,.navbar .container-fluid .brand{color:#82becd;text-shadow:none;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}.navbar .container .navbar-text,.navbar .container-fluid .navbar-text{color:#82becd}.navbar .container .navbar-text a,.navbar .container-fluid .navbar-text a{color:#82becd}@media (min-width:768px) and (max-width:979px){.navbar.navbar-fixed-top{position:fixed}}@media (max-width:767px){.navbar.navbar-fixed-top{margin-left:0;margin-right:0}}.nav.nav-list{padding-left:0;padding-right:0}.nav.nav-list li a{margin:0;padding:6px 15px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.nav.nav-list li a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.nav.nav-list li.active a{background-color:#c5c5cb}.nav.nav-list li.open>ul{display:block}.nav.nav-list li ul{display:none;margin-left:15px}.nav.nav-list li ul li a{font-weight:400;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:20px;margin:0;margin-left:-15px;padding:3px 30px;border:0;color:#2d2d2d;opacity:.7;filter:alpha(opacity=70)}.nav.nav-list li ul li a:hover{opacity:1;filter:alpha(opacity=100);background-color:transparent}.nav.nav-list li ul li.active a{color:#3f4657}.page-header{margin:10px 0;padding:0}.page-header h1{margin-top:0}.page-header sub-heading{padding:0,0,20px}pre{border:0;background-color:#82becd;border-radius:0;padding:10px;margin-left:-20px;padding-left:30px;margin-right:-20px;padding-right:30px}pre code{background:0 0;border:0}@media (min-width:1150px){.float-view .content-page{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.float-view .content-page article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.float-view .content-page article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.float-view .content-page table{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff;white-space:normal}.float-view .content-page table pre,.float-view .content-page table code{white-space:normal}.float-view .content-page .page-header{padding:0}.float-view .content-page .page-header,.float-view .content-page blockquote,.float-view .content-page p,.float-view .content-page ul,.float-view .content-page ol,.float-view .content-page dl,.float-view .content-page h2,.float-view .content-page h3,.float-view .content-page h4,.float-view .content-page h5,.float-view .content-page h6{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff}.float-view .content-page .page-header:before,.float-view .content-page blockquote:before,.float-view .content-page p:before,.float-view .content-page ul:before,.float-view .content-page ol:before,.float-view .content-page dl:before,.float-view .content-page h2:before,.float-view .content-page h3:before,.float-view .content-page h4:before,.float-view .content-page h5:before,.float-view .content-page h6:before{width:100%;height:10px;display:block;clear:both}.float-view .content-page .page-header p,.float-view .content-page blockquote p,.float-view .content-page p p,.float-view .content-page ul p,.float-view .content-page ol p,.float-view .content-page dl p,.float-view .content-page h2 p,.float-view .content-page h3 p,.float-view .content-page h4 p,.float-view .content-page h5 p,.float-view .content-page h6 p,.float-view .content-page .page-header ul,.float-view .content-page blockquote ul,.float-view .content-page p ul,.float-view .content-page ul ul,.float-view .content-page ol ul,.float-view .content-page dl ul,.float-view .content-page h2 ul,.float-view .content-page h3 ul,.float-view .content-page h4 ul,.float-view .content-page h5 ul,.float-view .content-page h6 ul,.float-view .content-page .page-header ol,.float-view .content-page blockquote ol,.float-view .content-page p ol,.float-view .content-page ul ol,.float-view .content-page ol ol,.float-view .content-page dl ol,.float-view .content-page h2 ol,.float-view .content-page h3 ol,.float-view .content-page h4 ol,.float-view .content-page h5 ol,.float-view .content-page h6 ol,.float-view .content-page .page-header dl,.float-view .content-page blockquote dl,.float-view .content-page p dl,.float-view .content-page ul dl,.float-view .content-page ol dl,.float-view .content-page dl dl,.float-view .content-page h2 dl,.float-view .content-page h3 dl,.float-view .content-page h4 dl,.float-view .content-page h5 dl,.float-view .content-page h6 dl,.float-view .content-page .page-header h2,.float-view .content-page blockquote h2,.float-view .content-page p h2,.float-view .content-page ul h2,.float-view .content-page ol h2,.float-view .content-page dl h2,.float-view .content-page h2 h2,.float-view .content-page h3 h2,.float-view .content-page h4 h2,.float-view .content-page h5 h2,.float-view .content-page h6 h2,.float-view .content-page .page-header h3,.float-view .content-page blockquote h3,.float-view .content-page p h3,.float-view .content-page ul h3,.float-view .content-page ol h3,.float-view .content-page dl h3,.float-view .content-page h2 h3,.float-view .content-page h3 h3,.float-view .content-page h4 h3,.float-view .content-page h5 h3,.float-view .content-page h6 h3,.float-view .content-page .page-header h4,.float-view .content-page blockquote h4,.float-view .content-page p h4,.float-view .content-page ul h4,.float-view .content-page ol h4,.float-view .content-page dl h4,.float-view .content-page h2 h4,.float-view .content-page h3 h4,.float-view .content-page h4 h4,.float-view .content-page h5 h4,.float-view .content-page h6 h4,.float-view .content-page .page-header h5,.float-view .content-page blockquote h5,.float-view .content-page p h5,.float-view .content-page ul h5,.float-view .content-page ol h5,.float-view .content-page dl h5,.float-view .content-page h2 h5,.float-view .content-page h3 h5,.float-view .content-page h4 h5,.float-view .content-page h5 h5,.float-view .content-page h6 h5,.float-view .content-page .page-header h6,.float-view .content-page blockquote h6,.float-view .content-page p h6,.float-view .content-page ul h6,.float-view .content-page ol h6,.float-view .content-page dl h6,.float-view .content-page h2 h6,.float-view .content-page h3 h6,.float-view .content-page h4 h6,.float-view .content-page h5 h6,.float-view .content-page h6 h6,.float-view .content-page .page-header pre,.float-view .content-page blockquote pre,.float-view .content-page p pre,.float-view .content-page ul pre,.float-view .content-page ol pre,.float-view .content-page dl pre,.float-view .content-page h2 pre,.float-view .content-page h3 pre,.float-view .content-page h4 pre,.float-view .content-page h5 pre,.float-view .content-page h6 pre{float:none;display:block}.float-view .content-page ul li,.float-view .content-page ol li{margin-left:30px}.float-view .content-page pre{float:left;clear:right;width:47%;border:0;border-left:10px solid #fff;margin:0 0 10px;padding:0 0 0 10px}}table{width:100%;border-bottom:1px solid #e7e7e9;margin-bottom:10px}table tr th,table tr td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #e7e7e9;border-left:1px solid #e7e7e9;border-color:#e7e7e9!important}table tr th:last-child,table tr td:last-child{border-right:1px solid #e7e7e9}.footer{position:fixed;bottom:0;left:0;padding:15px}#github-ribbon{position:absolute;top:50px;right:0;z-index:200}.well.well-sidebar{box-shadow:none;background-color:transparent;border-radius:0;border:0}.well.well-sidebar a{font-size:13px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#82becd;line-height:28px}.well.well-sidebar .twitter hr{border-bottom:0;margin-left:-20px;margin-right:-20px}.editor{position:absolute;top:0;left:0;right:0;background:#fff;padding:20px;padding-bottom:100px;min-height:100%;height:auto;display:none}.editor h3{width:100%!important}.editor.paddingTop{padding-top:50px}#markdown_editor{width:85%;margin:0 auto;padding:10px;height:auto;font-size:16px;min-height:100px;font-family:"Ubuntu Mono",Consolas,monospace;display:block}.hljs{display:block;padding:.5em}.hljs,.hljs-subst,.hljs-tag .hljs-title,.hljs-lisp .hljs-title,.hljs-clojure .hljs-built_in,.hljs-nginx .hljs-title{color:#3f4657}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value,.hljs-rules .hljs-value .hljs-number,.hljs-preprocessor,.hljs-ruby .hljs-symbol,.hljs-ruby .hljs-symbol .hljs-string,.hljs-aggregate,.hljs-template_tag,.hljs-django .hljs-variable,.hljs-smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-apache .hljs-cbracket,.hljs-tex .hljs-command,.hljs-tex .hljs-special,.hljs-erlang_repl .hljs-function_or_atom,.hljs-markdown .hljs-header{color:#022e99}.hljs-comment,.hljs-annotation,.hljs-template_comment,.hljs-diff .hljs-header,.hljs-chunk,.hljs-markdown .hljs-blockquote{color:#84989b}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-smalltalk .hljs-symbol,.hljs-smalltalk .hljs-char,.hljs-go .hljs-constant,.hljs-change,.hljs-markdown .hljs-bullet,.hljs-markdown .hljs-link_url{color:#2f9b92}.hljs-label,.hljs-javadoc,.hljs-ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.hljs-apache .hljs-sqbracket,.hljs-nginx .hljs-built_in,.hljs-tex .hljs-formula,.hljs-erlang_repl .hljs-reserved,.hljs-prompt,.hljs-markdown .hljs-link_label,.hljs-vhdl .hljs-attribute,.hljs-clojure .hljs-attribute,.hljs-coffeescript .hljs-property{color:#840d7a}.hljs-keyword,.hljs-id,.hljs-phpdoc,.hljs-title,.hljs-built_in,.hljs-aggregate,.hljs-css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-yardoctag,.hljs-smalltalk .hljs-class,.hljs-winutils,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-go .hljs-typename,.hljs-tex .hljs-command,.hljs-markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:700}.hljs-markdown .hljs-emphasis{font-style:italic}.hljs-nginx .hljs-built_in{font-weight:400}.hljs-coffeescript .hljs-javascript,.hljs-javascript .hljs-xml,.hljs-tex .hljs-formula,.hljs-xml .hljs-javascript,.hljs-xml .hljs-vbscript,.hljs-xml .hljs-css,.hljs-xml .hljs-cdata{opacity:.5} \ No newline at end of file diff --git a/less/daux-blue.less b/templates/default/themes/daux-blue/less/theme.less similarity index 84% rename from less/daux-blue.less rename to templates/default/themes/daux-blue/less/theme.less index 860725a..34e67ae 100644 --- a/less/daux-blue.less +++ b/templates/default/themes/daux-blue/less/theme.less @@ -10,4 +10,4 @@ @syntax-number: #2f9b92; @syntax-label: #840d7a; -@import "import/daux-base.less"; \ No newline at end of file +@import "../../_common/less/daux-base.less"; diff --git a/templates/default/themes/daux-green.thm b/templates/default/themes/daux-green/config.json similarity index 83% rename from templates/default/themes/daux-green.thm rename to templates/default/themes/daux-green/config.json index 01aaa97..a2637fa 100644 --- a/templates/default/themes/daux-green.thm +++ b/templates/default/themes/daux-green/config.json @@ -1,8 +1,8 @@ { "favicon": "img/favicon-green.png", - "css": ["css/daux-green.css"], + "css": ["css/theme.min.css"], "fonts": ["//fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700&subset=latin,cyrillic-ext,cyrillic"], "js": [], "require-jquery": true, "bootstrap-js": false -} \ No newline at end of file +} diff --git a/templates/default/themes/daux-navy/css/daux-navy.css b/templates/default/themes/daux-green/css/theme.min.css similarity index 80% rename from templates/default/themes/daux-navy/css/daux-navy.css rename to templates/default/themes/daux-green/css/theme.min.css index defc32d..092e2f2 100644 --- a/templates/default/themes/daux-navy/css/daux-navy.css +++ b/templates/default/themes/daux-green/css/theme.min.css @@ -2,4 +2,4 @@ * DAUX.IO * http://daux.io/ * MIT License - *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */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,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:0 0}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{-moz-box-sizing:content-box;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;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;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}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;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:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-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:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.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}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}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,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}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:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;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}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled,.homepage-footer.container-fluid .footer-nav{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:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}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:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}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}@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}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.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-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);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;-o-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:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@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 .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@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:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.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 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.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{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.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}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#969696}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);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:6px}.well-sm{padding:9px;border-radius:3px}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after{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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.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}tr.visible-sm{display:table-row!important}th.visible-sm,td.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}tr.visible-md{display:table-row!important}th.visible-md,td.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}tr.visible-lg{display:table-row!important}th.visible-lg,td.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}tr.visible-print{display:table-row!important}th.visible-print,td.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}}.roboto-slab.light{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:100}.roboto-slab.book{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}.roboto-slab.regular{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.roboto-slab.bold{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}h1,h2,h3,h4,h5,h6{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}pre{padding:0}.homepage-hero{padding-top:60px!important;background-color:#7795b4;box-shadow:none;border-radius:0;border:none;color:#13132a;overflow:hidden;padding-bottom:0;margin-bottom:0}.homepage-hero .text-center{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;margin:10px 0}.homepage-hero h2{margin:20px 0}.hero-buttons.container-fluid{padding:20px 0;background-color:#c5c5cb}.hero-buttons.container-fluid .btn-hero.btn{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;padding:20px 30px;background-image:none;filter:none;box-shadow:none;border-radius:0;text-shadow:none;border:none;opacity:.8;filter:alpha(opacity=80);margin:0 10px;text-transform:uppercase;border:5px solid #13132a}@media (max-width:767px){.hero-buttons.container-fluid .btn-hero.btn{display:block;margin-bottom:10px}}.hero-buttons.container-fluid .btn-hero.btn:hover{opacity:1;filter:alpha(opacity=100)}.hero-buttons.container-fluid .btn-hero.btn.btn-secondary{background-color:#c5c5cb;color:#13132a}.hero-buttons.container-fluid .btn-hero.btn.btn-primary{background-color:#13132a;color:#f5f5f6}.homepage-content.container-fluid{background-color:#fff;padding:40px 0}.homepage-content.container-fluid .lead{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.homepage-content.container-fluid ul,.homepage-content.container-fluid ol{padding:20px 0;margin:0 0 10px}.homepage-content.container-fluid ul li,.homepage-content.container-fluid ol li{list-style:none;padding-bottom:5px}.homepage-content.container-fluid ul li:before,.homepage-content.container-fluid ol li:before{content:'';width:0;height:0;border:3px solid transparent;border-left:3px solid #7795b4;float:left;display:block;margin:6px}@media (max-width:767px){.homepage-content.container-fluid{padding:40px 20px}}.homepage-footer.container-fluid{background-color:#13132a;box-shadow:none;border-radius:0;color:light;border:none}@media (max-width:767px){.homepage-footer.container-fluid{padding:0 20px}}.homepage-footer.container-fluid .footer-nav{margin:40px 0}.homepage-footer.container-fluid .footer-nav li a{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;font-size:16px;line-height:32px}.homepage-footer.container-fluid .footer-nav li a:hover{color:#7795b4;text-decoration:underline}.homepage-footer.container-fluid .twitter{margin-top:20px}.homepage-footer.container-fluid .twitter:first-child{margin-top:40px}html,body{margin:0;padding:0;height:100%;background-color:#7795b4;color:#2d2d2d}.container-fluid.fluid-height{height:100%}.columns{height:100%;padding-top:50px}.columns .left-column{background-color:#f5f5f6;border-right:1px solid #e7e7e9;overflow-x:hidden}.columns .right-column .content-page{padding:20px;min-height:100%;background-color:#fff}.content-area,.article-tree{overflow:auto;padding:0}@media (min-width:767px){.content-area,.article-tree{height:100%}}.responsive-collapse{padding:10px 15px;display:none;background-color:#e7e7e9;border-bottom:1px solid #e7e7e9}@media (max-width:767px){.responsive-collapse{display:block}}@media (max-width:768px){.sub-nav-collapse{display:none}}@media (min-width:768px){.sub-nav-collapse{display:block}}@media only screen and (max-width:800px){table,thead,tbody,th,td,tr{display:block;border:none}thead tr{position:absolute;top:-9999px;left:-9999px}tr{margin-bottom:10px;border-bottom:2px solid #ccc}tr td,tr th{border:1px solid #ccc;border-bottom:none}td{border:none;border-bottom:1px solid #eee;position:relative;padding-left:50%!important;white-space:normal;text-align:left}td:before{position:absolute;top:6px;left:6px;width:45%;padding-right:10px;white-space:nowrap;text-align:left;font-weight:700}td:before{content:attr(data-title)}}a{color:#7795b4}.btn.btn-sidebar{padding:7px 10px;background-image:none;filter:none;box-shadow:none;background-color:#c5c5cb;border:none}.btn.btn-sidebar .icon-bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#13132a;box-shadow:none}.btn.btn-sidebar:hover{box-shadow:none;background-color:#13132a}.btn.btn-sidebar:hover .icon-bar{background-color:#7795b4;box-shadow:none}code{color:#7795b4}.navbar{box-shadow:0 1px 5px rgba(0,0,0,.25);background-color:#13132a;margin-bottom:0;z-index:200}.navbar .container,.navbar .container-fluid{background-image:none;filter:none;border-bottom:none;padding:0 20px}.navbar .container .brand,.navbar .container-fluid .brand{color:#7795b4;text-shadow:none;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}.navbar .container .navbar-text,.navbar .container-fluid .navbar-text{color:#7795b4}.navbar .container .navbar-text a,.navbar .container-fluid .navbar-text a{color:#7795b4}@media (min-width:768px) and (max-width:979px){.navbar.navbar-fixed-top{position:fixed}}@media (max-width:767px){.navbar.navbar-fixed-top{margin-left:0;margin-right:0}}.nav.nav-list{padding-left:0;padding-right:0}.nav.nav-list li a{margin:0;padding:6px 15px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#13132a;font-size:15px;text-shadow:none;border-color:#e7e7e9}.nav.nav-list li a:hover{color:#13132a;text-shadow:none;background-color:#c5c5cb}.nav.nav-list li.active a{background-color:#c5c5cb}.nav.nav-list li.open>ul{display:block}.nav.nav-list li ul{display:none;margin-left:15px}.nav.nav-list li ul li a{font-weight:400;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:20px;margin:0;margin-left:-15px;padding:3px 30px;border:none;color:#2d2d2d;opacity:.7;filter:alpha(opacity=70)}.nav.nav-list li ul li a:hover{opacity:1;filter:alpha(opacity=100);background-color:transparent}.nav.nav-list li ul li.active a{color:#13132a}.page-header{margin:10px 0;padding:0}.page-header h1{margin-top:0}.page-header sub-heading{padding:0,0,20px}pre{border:none;background-color:#7795b4;border-radius:0;padding:10px;margin-left:-20px;padding-left:30px;margin-right:-20px;padding-right:30px}pre code{background:0 0;border:none}@media (min-width:1150px){.float-view .content-page{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.float-view .content-page article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.float-view .content-page article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.float-view .content-page table{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff;white-space:normal}.float-view .content-page table pre,.float-view .content-page table code{white-space:normal}.float-view .content-page .page-header{padding:0}.float-view .content-page .page-header,.float-view .content-page blockquote,.float-view .content-page p,.float-view .content-page ul,.float-view .content-page ol,.float-view .content-page dl,.float-view .content-page h2,.float-view .content-page h3,.float-view .content-page h4,.float-view .content-page h5,.float-view .content-page h6{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff}.float-view .content-page .page-header:before,.float-view .content-page blockquote:before,.float-view .content-page p:before,.float-view .content-page ul:before,.float-view .content-page ol:before,.float-view .content-page dl:before,.float-view .content-page h2:before,.float-view .content-page h3:before,.float-view .content-page h4:before,.float-view .content-page h5:before,.float-view .content-page h6:before{width:100%;height:10px;display:block;clear:both}.float-view .content-page .page-header p,.float-view .content-page blockquote p,.float-view .content-page p p,.float-view .content-page ul p,.float-view .content-page ol p,.float-view .content-page dl p,.float-view .content-page h2 p,.float-view .content-page h3 p,.float-view .content-page h4 p,.float-view .content-page h5 p,.float-view .content-page h6 p,.float-view .content-page .page-header ul,.float-view .content-page blockquote ul,.float-view .content-page p ul,.float-view .content-page ul ul,.float-view .content-page ol ul,.float-view .content-page dl ul,.float-view .content-page h2 ul,.float-view .content-page h3 ul,.float-view .content-page h4 ul,.float-view .content-page h5 ul,.float-view .content-page h6 ul,.float-view .content-page .page-header ol,.float-view .content-page blockquote ol,.float-view .content-page p ol,.float-view .content-page ul ol,.float-view .content-page ol ol,.float-view .content-page dl ol,.float-view .content-page h2 ol,.float-view .content-page h3 ol,.float-view .content-page h4 ol,.float-view .content-page h5 ol,.float-view .content-page h6 ol,.float-view .content-page .page-header dl,.float-view .content-page blockquote dl,.float-view .content-page p dl,.float-view .content-page ul dl,.float-view .content-page ol dl,.float-view .content-page dl dl,.float-view .content-page h2 dl,.float-view .content-page h3 dl,.float-view .content-page h4 dl,.float-view .content-page h5 dl,.float-view .content-page h6 dl,.float-view .content-page .page-header h2,.float-view .content-page blockquote h2,.float-view .content-page p h2,.float-view .content-page ul h2,.float-view .content-page ol h2,.float-view .content-page dl h2,.float-view .content-page h2 h2,.float-view .content-page h3 h2,.float-view .content-page h4 h2,.float-view .content-page h5 h2,.float-view .content-page h6 h2,.float-view .content-page .page-header h3,.float-view .content-page blockquote h3,.float-view .content-page p h3,.float-view .content-page ul h3,.float-view .content-page ol h3,.float-view .content-page dl h3,.float-view .content-page h2 h3,.float-view .content-page h3 h3,.float-view .content-page h4 h3,.float-view .content-page h5 h3,.float-view .content-page h6 h3,.float-view .content-page .page-header h4,.float-view .content-page blockquote h4,.float-view .content-page p h4,.float-view .content-page ul h4,.float-view .content-page ol h4,.float-view .content-page dl h4,.float-view .content-page h2 h4,.float-view .content-page h3 h4,.float-view .content-page h4 h4,.float-view .content-page h5 h4,.float-view .content-page h6 h4,.float-view .content-page .page-header h5,.float-view .content-page blockquote h5,.float-view .content-page p h5,.float-view .content-page ul h5,.float-view .content-page ol h5,.float-view .content-page dl h5,.float-view .content-page h2 h5,.float-view .content-page h3 h5,.float-view .content-page h4 h5,.float-view .content-page h5 h5,.float-view .content-page h6 h5,.float-view .content-page .page-header h6,.float-view .content-page blockquote h6,.float-view .content-page p h6,.float-view .content-page ul h6,.float-view .content-page ol h6,.float-view .content-page dl h6,.float-view .content-page h2 h6,.float-view .content-page h3 h6,.float-view .content-page h4 h6,.float-view .content-page h5 h6,.float-view .content-page h6 h6,.float-view .content-page .page-header pre,.float-view .content-page blockquote pre,.float-view .content-page p pre,.float-view .content-page ul pre,.float-view .content-page ol pre,.float-view .content-page dl pre,.float-view .content-page h2 pre,.float-view .content-page h3 pre,.float-view .content-page h4 pre,.float-view .content-page h5 pre,.float-view .content-page h6 pre{float:none;display:block}.float-view .content-page ul li,.float-view .content-page ol li{margin-left:30px}.float-view .content-page pre{float:left;clear:right;width:47%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0 0 0 10px}}table{width:100%;border-bottom:1px solid #e7e7e9;margin-bottom:10px}table tr th,table tr td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #e7e7e9;border-left:1px solid #e7e7e9;border-color:#e7e7e9!important}table tr th:last-child,table tr td:last-child{border-right:1px solid #e7e7e9}.footer{position:fixed;bottom:0;left:0;padding:15px}#github-ribbon{position:absolute;top:50px;right:0;z-index:200}.well.well-sidebar{box-shadow:none;background-color:transparent;border-radius:0;border:none}.well.well-sidebar a{font-size:13px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#7795b4;line-height:28px}.well.well-sidebar .twitter hr{border-bottom:none;margin-left:-20px;margin-right:-20px}.editor{position:absolute;top:0;left:0;right:0;background:#fff;padding:20px;padding-bottom:100px;min-height:100%;height:auto;display:none}.editor h3{width:100%!important}.editor.paddingTop{padding-top:50px}#markdown_editor{width:85%;margin:0 auto;padding:10px;height:auto;font-size:16px;min-height:100px;font-family:"Ubuntu Mono",Consolas,monospace;display:block}.hljs{display:block;padding:.5em}.hljs,.hljs-subst,.hljs-tag .hljs-title,.hljs-lisp .hljs-title,.hljs-clojure .hljs-built_in,.hljs-nginx .hljs-title{color:#13132a}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value,.hljs-rules .hljs-value .hljs-number,.hljs-preprocessor,.hljs-ruby .hljs-symbol,.hljs-ruby .hljs-symbol .hljs-string,.hljs-aggregate,.hljs-template_tag,.hljs-django .hljs-variable,.hljs-smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-apache .hljs-cbracket,.hljs-tex .hljs-command,.hljs-tex .hljs-special,.hljs-erlang_repl .hljs-function_or_atom,.hljs-markdown .hljs-header{color:#000}.hljs-comment,.hljs-annotation,.hljs-template_comment,.hljs-diff .hljs-header,.hljs-chunk,.hljs-markdown .hljs-blockquote{color:#505050}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-smalltalk .hljs-symbol,.hljs-smalltalk .hljs-char,.hljs-go .hljs-constant,.hljs-change,.hljs-markdown .hljs-bullet,.hljs-markdown .hljs-link_url{color:#09559b}.hljs-label,.hljs-javadoc,.hljs-ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.hljs-apache .hljs-sqbracket,.hljs-nginx .hljs-built_in,.hljs-tex .hljs-formula,.hljs-erlang_repl .hljs-reserved,.hljs-prompt,.hljs-markdown .hljs-link_label,.hljs-vhdl .hljs-attribute,.hljs-clojure .hljs-attribute,.hljs-coffeescript .hljs-property{color:#001775}.hljs-keyword,.hljs-id,.hljs-phpdoc,.hljs-title,.hljs-built_in,.hljs-aggregate,.hljs-css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-yardoctag,.hljs-smalltalk .hljs-class,.hljs-winutils,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-go .hljs-typename,.hljs-tex .hljs-command,.hljs-markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:700}.hljs-markdown .hljs-emphasis{font-style:italic}.hljs-nginx .hljs-built_in{font-weight:400}.hljs-coffeescript .hljs-javascript,.hljs-javascript .hljs-xml,.hljs-tex .hljs-formula,.hljs-xml .hljs-javascript,.hljs-xml .hljs-vbscript,.hljs-xml .hljs-css,.hljs-xml .hljs-cdata{opacity:.5} \ No newline at end of file + *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */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,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:0 0}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{-moz-box-sizing:content-box;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;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;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}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;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:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-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:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.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}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}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,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}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:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;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}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled,.homepage-footer.container-fluid .footer-nav{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:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}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:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}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}@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}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.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-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);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;-o-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:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@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 .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@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:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.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 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.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{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.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}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#969696}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);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:6px}.well-sm{padding:9px;border-radius:3px}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after{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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.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}tr.visible-sm{display:table-row!important}th.visible-sm,td.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}tr.visible-md{display:table-row!important}th.visible-md,td.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}tr.visible-lg{display:table-row!important}th.visible-lg,td.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}tr.visible-print{display:table-row!important}th.visible-print,td.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}}.roboto-slab.light{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:100}.roboto-slab.book{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}.roboto-slab.regular{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.roboto-slab.bold{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}h1,h2,h3,h4,h5,h6{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}pre{padding:0}.homepage-hero{padding-top:60px!important;background-color:#8acc37;box-shadow:none;border-radius:0;border:0;color:#000;overflow:hidden;padding-bottom:0;margin-bottom:0}.homepage-hero .text-center{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;margin:10px 0}.homepage-hero h2{margin:20px 0}.hero-buttons.container-fluid{padding:20px 0;background-color:#a0d55d}.hero-buttons.container-fluid .btn-hero.btn{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;padding:20px 30px;background-image:none;filter:none;box-shadow:none;border-radius:0;text-shadow:none;border:0;opacity:.8;filter:alpha(opacity=80);margin:0 10px;text-transform:uppercase;border:5px solid #000}@media (max-width:767px){.hero-buttons.container-fluid .btn-hero.btn{display:block;margin-bottom:10px}}.hero-buttons.container-fluid .btn-hero.btn:hover{opacity:1;filter:alpha(opacity=100)}.hero-buttons.container-fluid .btn-hero.btn.btn-secondary{background-color:#a0d55d;color:#000}.hero-buttons.container-fluid .btn-hero.btn.btn-primary{background-color:#000;color:#f5f5f6}.homepage-content.container-fluid{background-color:#fff;padding:40px 0}.homepage-content.container-fluid .lead{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.homepage-content.container-fluid ul,.homepage-content.container-fluid ol{padding:20px 0;margin:0 0 10px}.homepage-content.container-fluid ul li,.homepage-content.container-fluid ol li{list-style:none;padding-bottom:5px}.homepage-content.container-fluid ul li:before,.homepage-content.container-fluid ol li:before{content:'';width:0;height:0;border:3px solid transparent;border-left:3px solid #8acc37;float:left;display:block;margin:6px}@media (max-width:767px){.homepage-content.container-fluid{padding:40px 20px}}.homepage-footer.container-fluid{background-color:#000;box-shadow:none;border-radius:0;color:light;border:0}@media (max-width:767px){.homepage-footer.container-fluid{padding:0 20px}}.homepage-footer.container-fluid .footer-nav{margin:40px 0}.homepage-footer.container-fluid .footer-nav li a{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;font-size:16px;line-height:32px}.homepage-footer.container-fluid .footer-nav li a:hover{color:#8acc37;text-decoration:underline}.homepage-footer.container-fluid .twitter{margin-top:20px}.homepage-footer.container-fluid .twitter:first-child{margin-top:40px}html,body{margin:0;padding:0;height:100%;background-color:#8acc37;color:#2d2d2d}.container-fluid.fluid-height{height:100%}.columns{height:100%;padding-top:50px}.columns .left-column{background-color:#f5f5f6;border-right:1px solid #e7e7e9;overflow-x:hidden}.columns .right-column .content-page{padding:20px;min-height:100%;background-color:#fff}.content-area,.article-tree{overflow:auto;padding:0}@media (min-width:767px){.content-area,.article-tree{height:100%}}.responsive-collapse{padding:10px 15px;display:none;background-color:#e7e7e9;border-bottom:1px solid #e7e7e9}@media (max-width:767px){.responsive-collapse{display:block}}@media (max-width:768px){.sub-nav-collapse{display:none}}@media (min-width:768px){.sub-nav-collapse{display:block}}@media only screen and (max-width:800px){table,thead,tbody,th,td,tr{display:block;border:0}thead tr{position:absolute;top:-9999px;left:-9999px}tr{margin-bottom:10px;border-bottom:2px solid #ccc}tr td,tr th{border:1px solid #ccc;border-bottom:0}td{border:0;border-bottom:1px solid #eee;position:relative;padding-left:50%!important;white-space:normal;text-align:left}td:before{position:absolute;top:6px;left:6px;width:45%;padding-right:10px;white-space:nowrap;text-align:left;font-weight:700}td:before{content:attr(data-title)}}a{color:#8acc37}.btn.btn-sidebar{padding:7px 10px;background-image:none;filter:none;box-shadow:none;background-color:#a0d55d;border:0}.btn.btn-sidebar .icon-bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#000;box-shadow:none}.btn.btn-sidebar:hover{box-shadow:none;background-color:#000}.btn.btn-sidebar:hover .icon-bar{background-color:#8acc37;box-shadow:none}code{color:#8acc37}.navbar{box-shadow:0 1px 5px rgba(0,0,0,.25);background-color:#000;margin-bottom:0;z-index:200}.navbar .container,.navbar .container-fluid{background-image:none;filter:none;border-bottom:0;padding:0 20px}.navbar .container .brand,.navbar .container-fluid .brand{color:#8acc37;text-shadow:none;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}.navbar .container .navbar-text,.navbar .container-fluid .navbar-text{color:#8acc37}.navbar .container .navbar-text a,.navbar .container-fluid .navbar-text a{color:#8acc37}@media (min-width:768px) and (max-width:979px){.navbar.navbar-fixed-top{position:fixed}}@media (max-width:767px){.navbar.navbar-fixed-top{margin-left:0;margin-right:0}}.nav.nav-list{padding-left:0;padding-right:0}.nav.nav-list li a{margin:0;padding:6px 15px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#000;font-size:15px;text-shadow:none;border-color:#e7e7e9}.nav.nav-list li a:hover{color:#000;text-shadow:none;background-color:#a0d55d}.nav.nav-list li.active a{background-color:#a0d55d}.nav.nav-list li.open>ul{display:block}.nav.nav-list li ul{display:none;margin-left:15px}.nav.nav-list li ul li a{font-weight:400;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:20px;margin:0;margin-left:-15px;padding:3px 30px;border:0;color:#2d2d2d;opacity:.7;filter:alpha(opacity=70)}.nav.nav-list li ul li a:hover{opacity:1;filter:alpha(opacity=100);background-color:transparent}.nav.nav-list li ul li.active a{color:#000}.page-header{margin:10px 0;padding:0}.page-header h1{margin-top:0}.page-header sub-heading{padding:0,0,20px}pre{border:0;background-color:#8acc37;border-radius:0;padding:10px;margin-left:-20px;padding-left:30px;margin-right:-20px;padding-right:30px}pre code{background:0 0;border:0}@media (min-width:1150px){.float-view .content-page{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.float-view .content-page article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.float-view .content-page article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.float-view .content-page table{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff;white-space:normal}.float-view .content-page table pre,.float-view .content-page table code{white-space:normal}.float-view .content-page .page-header{padding:0}.float-view .content-page .page-header,.float-view .content-page blockquote,.float-view .content-page p,.float-view .content-page ul,.float-view .content-page ol,.float-view .content-page dl,.float-view .content-page h2,.float-view .content-page h3,.float-view .content-page h4,.float-view .content-page h5,.float-view .content-page h6{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff}.float-view .content-page .page-header:before,.float-view .content-page blockquote:before,.float-view .content-page p:before,.float-view .content-page ul:before,.float-view .content-page ol:before,.float-view .content-page dl:before,.float-view .content-page h2:before,.float-view .content-page h3:before,.float-view .content-page h4:before,.float-view .content-page h5:before,.float-view .content-page h6:before{width:100%;height:10px;display:block;clear:both}.float-view .content-page .page-header p,.float-view .content-page blockquote p,.float-view .content-page p p,.float-view .content-page ul p,.float-view .content-page ol p,.float-view .content-page dl p,.float-view .content-page h2 p,.float-view .content-page h3 p,.float-view .content-page h4 p,.float-view .content-page h5 p,.float-view .content-page h6 p,.float-view .content-page .page-header ul,.float-view .content-page blockquote ul,.float-view .content-page p ul,.float-view .content-page ul ul,.float-view .content-page ol ul,.float-view .content-page dl ul,.float-view .content-page h2 ul,.float-view .content-page h3 ul,.float-view .content-page h4 ul,.float-view .content-page h5 ul,.float-view .content-page h6 ul,.float-view .content-page .page-header ol,.float-view .content-page blockquote ol,.float-view .content-page p ol,.float-view .content-page ul ol,.float-view .content-page ol ol,.float-view .content-page dl ol,.float-view .content-page h2 ol,.float-view .content-page h3 ol,.float-view .content-page h4 ol,.float-view .content-page h5 ol,.float-view .content-page h6 ol,.float-view .content-page .page-header dl,.float-view .content-page blockquote dl,.float-view .content-page p dl,.float-view .content-page ul dl,.float-view .content-page ol dl,.float-view .content-page dl dl,.float-view .content-page h2 dl,.float-view .content-page h3 dl,.float-view .content-page h4 dl,.float-view .content-page h5 dl,.float-view .content-page h6 dl,.float-view .content-page .page-header h2,.float-view .content-page blockquote h2,.float-view .content-page p h2,.float-view .content-page ul h2,.float-view .content-page ol h2,.float-view .content-page dl h2,.float-view .content-page h2 h2,.float-view .content-page h3 h2,.float-view .content-page h4 h2,.float-view .content-page h5 h2,.float-view .content-page h6 h2,.float-view .content-page .page-header h3,.float-view .content-page blockquote h3,.float-view .content-page p h3,.float-view .content-page ul h3,.float-view .content-page ol h3,.float-view .content-page dl h3,.float-view .content-page h2 h3,.float-view .content-page h3 h3,.float-view .content-page h4 h3,.float-view .content-page h5 h3,.float-view .content-page h6 h3,.float-view .content-page .page-header h4,.float-view .content-page blockquote h4,.float-view .content-page p h4,.float-view .content-page ul h4,.float-view .content-page ol h4,.float-view .content-page dl h4,.float-view .content-page h2 h4,.float-view .content-page h3 h4,.float-view .content-page h4 h4,.float-view .content-page h5 h4,.float-view .content-page h6 h4,.float-view .content-page .page-header h5,.float-view .content-page blockquote h5,.float-view .content-page p h5,.float-view .content-page ul h5,.float-view .content-page ol h5,.float-view .content-page dl h5,.float-view .content-page h2 h5,.float-view .content-page h3 h5,.float-view .content-page h4 h5,.float-view .content-page h5 h5,.float-view .content-page h6 h5,.float-view .content-page .page-header h6,.float-view .content-page blockquote h6,.float-view .content-page p h6,.float-view .content-page ul h6,.float-view .content-page ol h6,.float-view .content-page dl h6,.float-view .content-page h2 h6,.float-view .content-page h3 h6,.float-view .content-page h4 h6,.float-view .content-page h5 h6,.float-view .content-page h6 h6,.float-view .content-page .page-header pre,.float-view .content-page blockquote pre,.float-view .content-page p pre,.float-view .content-page ul pre,.float-view .content-page ol pre,.float-view .content-page dl pre,.float-view .content-page h2 pre,.float-view .content-page h3 pre,.float-view .content-page h4 pre,.float-view .content-page h5 pre,.float-view .content-page h6 pre{float:none;display:block}.float-view .content-page ul li,.float-view .content-page ol li{margin-left:30px}.float-view .content-page pre{float:left;clear:right;width:47%;border:0;border-left:10px solid #fff;margin:0 0 10px;padding:0 0 0 10px}}table{width:100%;border-bottom:1px solid #e7e7e9;margin-bottom:10px}table tr th,table tr td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #e7e7e9;border-left:1px solid #e7e7e9;border-color:#e7e7e9!important}table tr th:last-child,table tr td:last-child{border-right:1px solid #e7e7e9}.footer{position:fixed;bottom:0;left:0;padding:15px}#github-ribbon{position:absolute;top:50px;right:0;z-index:200}.well.well-sidebar{box-shadow:none;background-color:transparent;border-radius:0;border:0}.well.well-sidebar a{font-size:13px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#8acc37;line-height:28px}.well.well-sidebar .twitter hr{border-bottom:0;margin-left:-20px;margin-right:-20px}.editor{position:absolute;top:0;left:0;right:0;background:#fff;padding:20px;padding-bottom:100px;min-height:100%;height:auto;display:none}.editor h3{width:100%!important}.editor.paddingTop{padding-top:50px}#markdown_editor{width:85%;margin:0 auto;padding:10px;height:auto;font-size:16px;min-height:100px;font-family:"Ubuntu Mono",Consolas,monospace;display:block}.hljs{display:block;padding:.5em}.hljs,.hljs-subst,.hljs-tag .hljs-title,.hljs-lisp .hljs-title,.hljs-clojure .hljs-built_in,.hljs-nginx .hljs-title{color:#000}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value,.hljs-rules .hljs-value .hljs-number,.hljs-preprocessor,.hljs-ruby .hljs-symbol,.hljs-ruby .hljs-symbol .hljs-string,.hljs-aggregate,.hljs-template_tag,.hljs-django .hljs-variable,.hljs-smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-apache .hljs-cbracket,.hljs-tex .hljs-command,.hljs-tex .hljs-special,.hljs-erlang_repl .hljs-function_or_atom,.hljs-markdown .hljs-header{color:#e0ff00}.hljs-comment,.hljs-annotation,.hljs-template_comment,.hljs-diff .hljs-header,.hljs-chunk,.hljs-markdown .hljs-blockquote{color:#c4e598}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-smalltalk .hljs-symbol,.hljs-smalltalk .hljs-char,.hljs-go .hljs-constant,.hljs-change,.hljs-markdown .hljs-bullet,.hljs-markdown .hljs-link_url{color:#097c4e}.hljs-label,.hljs-javadoc,.hljs-ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.hljs-apache .hljs-sqbracket,.hljs-nginx .hljs-built_in,.hljs-tex .hljs-formula,.hljs-erlang_repl .hljs-reserved,.hljs-prompt,.hljs-markdown .hljs-link_label,.hljs-vhdl .hljs-attribute,.hljs-clojure .hljs-attribute,.hljs-coffeescript .hljs-property{color:#022e99}.hljs-keyword,.hljs-id,.hljs-phpdoc,.hljs-title,.hljs-built_in,.hljs-aggregate,.hljs-css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-yardoctag,.hljs-smalltalk .hljs-class,.hljs-winutils,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-go .hljs-typename,.hljs-tex .hljs-command,.hljs-markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:700}.hljs-markdown .hljs-emphasis{font-style:italic}.hljs-nginx .hljs-built_in{font-weight:400}.hljs-coffeescript .hljs-javascript,.hljs-javascript .hljs-xml,.hljs-tex .hljs-formula,.hljs-xml .hljs-javascript,.hljs-xml .hljs-vbscript,.hljs-xml .hljs-css,.hljs-xml .hljs-cdata{opacity:.5} \ No newline at end of file diff --git a/less/daux-green.less b/templates/default/themes/daux-green/less/theme.less similarity index 84% rename from less/daux-green.less rename to templates/default/themes/daux-green/less/theme.less index be3a189..1798077 100644 --- a/less/daux-green.less +++ b/templates/default/themes/daux-green/less/theme.less @@ -10,4 +10,4 @@ @syntax-number: #097c4e; @syntax-label: #022e99; -@import "import/daux-base.less"; \ No newline at end of file +@import "../../_common/less/daux-base.less"; diff --git a/templates/default/themes/daux-navy.thm b/templates/default/themes/daux-navy/config.json similarity index 83% rename from templates/default/themes/daux-navy.thm rename to templates/default/themes/daux-navy/config.json index f86c54b..f5e9b05 100644 --- a/templates/default/themes/daux-navy.thm +++ b/templates/default/themes/daux-navy/config.json @@ -1,8 +1,8 @@ { "favicon": "img/favicon-navy.png", - "css": ["css/daux-navy.css"], + "css": ["css/theme.min.css"], "fonts": ["//fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700&subset=latin,cyrillic-ext,cyrillic"], "js": [], "require-jquery": true, "bootstrap-js": false -} \ No newline at end of file +} diff --git a/templates/default/themes/daux-red/css/daux-red.css b/templates/default/themes/daux-navy/css/theme.min.css similarity index 83% rename from templates/default/themes/daux-red/css/daux-red.css rename to templates/default/themes/daux-navy/css/theme.min.css index 4bede8b..e3f37b3 100644 --- a/templates/default/themes/daux-red/css/daux-red.css +++ b/templates/default/themes/daux-navy/css/theme.min.css @@ -2,4 +2,4 @@ * DAUX.IO * http://daux.io/ * MIT License - *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */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,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:0 0}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{-moz-box-sizing:content-box;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;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;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}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;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:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-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:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.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}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}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,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}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:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;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}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled,.homepage-footer.container-fluid .footer-nav{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:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}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:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}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}@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}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.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-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);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;-o-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:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@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 .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@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:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.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 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.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{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.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}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#969696}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);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:6px}.well-sm{padding:9px;border-radius:3px}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after{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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.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}tr.visible-sm{display:table-row!important}th.visible-sm,td.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}tr.visible-md{display:table-row!important}th.visible-md,td.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}tr.visible-lg{display:table-row!important}th.visible-lg,td.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}tr.visible-print{display:table-row!important}th.visible-print,td.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}}.roboto-slab.light{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:100}.roboto-slab.book{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}.roboto-slab.regular{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.roboto-slab.bold{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}h1,h2,h3,h4,h5,h6{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}pre{padding:0}.homepage-hero{padding-top:60px!important;background-color:#ecb5a1;box-shadow:none;border-radius:0;border:none;color:#c64641;overflow:hidden;padding-bottom:0;margin-bottom:0}.homepage-hero .text-center{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;margin:10px 0}.homepage-hero h2{margin:20px 0}.hero-buttons.container-fluid{padding:20px 0;background-color:#eee}.hero-buttons.container-fluid .btn-hero.btn{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;padding:20px 30px;background-image:none;filter:none;box-shadow:none;border-radius:0;text-shadow:none;border:none;opacity:.8;filter:alpha(opacity=80);margin:0 10px;text-transform:uppercase;border:5px solid #c64641}@media (max-width:767px){.hero-buttons.container-fluid .btn-hero.btn{display:block;margin-bottom:10px}}.hero-buttons.container-fluid .btn-hero.btn:hover{opacity:1;filter:alpha(opacity=100)}.hero-buttons.container-fluid .btn-hero.btn.btn-secondary{background-color:#eee;color:#c64641}.hero-buttons.container-fluid .btn-hero.btn.btn-primary{background-color:#c64641;color:#f7f7f7}.homepage-content.container-fluid{background-color:#fff;padding:40px 0}.homepage-content.container-fluid .lead{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.homepage-content.container-fluid ul,.homepage-content.container-fluid ol{padding:20px 0;margin:0 0 10px}.homepage-content.container-fluid ul li,.homepage-content.container-fluid ol li{list-style:none;padding-bottom:5px}.homepage-content.container-fluid ul li:before,.homepage-content.container-fluid ol li:before{content:'';width:0;height:0;border:3px solid transparent;border-left:3px solid #ecb5a1;float:left;display:block;margin:6px}@media (max-width:767px){.homepage-content.container-fluid{padding:40px 20px}}.homepage-footer.container-fluid{background-color:#c64641;box-shadow:none;border-radius:0;color:light;border:none}@media (max-width:767px){.homepage-footer.container-fluid{padding:0 20px}}.homepage-footer.container-fluid .footer-nav{margin:40px 0}.homepage-footer.container-fluid .footer-nav li a{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;font-size:16px;line-height:32px}.homepage-footer.container-fluid .footer-nav li a:hover{color:#ecb5a1;text-decoration:underline}.homepage-footer.container-fluid .twitter{margin-top:20px}.homepage-footer.container-fluid .twitter:first-child{margin-top:40px}html,body{margin:0;padding:0;height:100%;background-color:#ecb5a1;color:#2d2d2d}.container-fluid.fluid-height{height:100%}.columns{height:100%;padding-top:50px}.columns .left-column{background-color:#f7f7f7;border-right:1px solid #eee;overflow-x:hidden}.columns .right-column .content-page{padding:20px;min-height:100%;background-color:#fff}.content-area,.article-tree{overflow:auto;padding:0}@media (min-width:767px){.content-area,.article-tree{height:100%}}.responsive-collapse{padding:10px 15px;display:none;background-color:#eee;border-bottom:1px solid #eee}@media (max-width:767px){.responsive-collapse{display:block}}@media (max-width:768px){.sub-nav-collapse{display:none}}@media (min-width:768px){.sub-nav-collapse{display:block}}@media only screen and (max-width:800px){table,thead,tbody,th,td,tr{display:block;border:none}thead tr{position:absolute;top:-9999px;left:-9999px}tr{margin-bottom:10px;border-bottom:2px solid #ccc}tr td,tr th{border:1px solid #ccc;border-bottom:none}td{border:none;border-bottom:1px solid #eee;position:relative;padding-left:50%!important;white-space:normal;text-align:left}td:before{position:absolute;top:6px;left:6px;width:45%;padding-right:10px;white-space:nowrap;text-align:left;font-weight:700}td:before{content:attr(data-title)}}a{color:#ecb5a1}.btn.btn-sidebar{padding:7px 10px;background-image:none;filter:none;box-shadow:none;background-color:#eee;border:none}.btn.btn-sidebar .icon-bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#c64641;box-shadow:none}.btn.btn-sidebar:hover{box-shadow:none;background-color:#c64641}.btn.btn-sidebar:hover .icon-bar{background-color:#ecb5a1;box-shadow:none}code{color:#ecb5a1}.navbar{box-shadow:0 1px 5px rgba(0,0,0,.25);background-color:#c64641;margin-bottom:0;z-index:200}.navbar .container,.navbar .container-fluid{background-image:none;filter:none;border-bottom:none;padding:0 20px}.navbar .container .brand,.navbar .container-fluid .brand{color:#ecb5a1;text-shadow:none;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}.navbar .container .navbar-text,.navbar .container-fluid .navbar-text{color:#ecb5a1}.navbar .container .navbar-text a,.navbar .container-fluid .navbar-text a{color:#ecb5a1}@media (min-width:768px) and (max-width:979px){.navbar.navbar-fixed-top{position:fixed}}@media (max-width:767px){.navbar.navbar-fixed-top{margin-left:0;margin-right:0}}.nav.nav-list{padding-left:0;padding-right:0}.nav.nav-list li a{margin:0;padding:6px 15px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#c64641;font-size:15px;text-shadow:none;border-color:#eee}.nav.nav-list li a:hover{color:#c64641;text-shadow:none;background-color:#eee}.nav.nav-list li.active a{background-color:#eee}.nav.nav-list li.open>ul{display:block}.nav.nav-list li ul{display:none;margin-left:15px}.nav.nav-list li ul li a{font-weight:400;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:20px;margin:0;margin-left:-15px;padding:3px 30px;border:none;color:#2d2d2d;opacity:.7;filter:alpha(opacity=70)}.nav.nav-list li ul li a:hover{opacity:1;filter:alpha(opacity=100);background-color:transparent}.nav.nav-list li ul li.active a{color:#c64641}.page-header{margin:10px 0;padding:0}.page-header h1{margin-top:0}.page-header sub-heading{padding:0,0,20px}pre{border:none;background-color:#ecb5a1;border-radius:0;padding:10px;margin-left:-20px;padding-left:30px;margin-right:-20px;padding-right:30px}pre code{background:0 0;border:none}@media (min-width:1150px){.float-view .content-page{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.float-view .content-page article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.float-view .content-page article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.float-view .content-page table{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff;white-space:normal}.float-view .content-page table pre,.float-view .content-page table code{white-space:normal}.float-view .content-page .page-header{padding:0}.float-view .content-page .page-header,.float-view .content-page blockquote,.float-view .content-page p,.float-view .content-page ul,.float-view .content-page ol,.float-view .content-page dl,.float-view .content-page h2,.float-view .content-page h3,.float-view .content-page h4,.float-view .content-page h5,.float-view .content-page h6{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff}.float-view .content-page .page-header:before,.float-view .content-page blockquote:before,.float-view .content-page p:before,.float-view .content-page ul:before,.float-view .content-page ol:before,.float-view .content-page dl:before,.float-view .content-page h2:before,.float-view .content-page h3:before,.float-view .content-page h4:before,.float-view .content-page h5:before,.float-view .content-page h6:before{width:100%;height:10px;display:block;clear:both}.float-view .content-page .page-header p,.float-view .content-page blockquote p,.float-view .content-page p p,.float-view .content-page ul p,.float-view .content-page ol p,.float-view .content-page dl p,.float-view .content-page h2 p,.float-view .content-page h3 p,.float-view .content-page h4 p,.float-view .content-page h5 p,.float-view .content-page h6 p,.float-view .content-page .page-header ul,.float-view .content-page blockquote ul,.float-view .content-page p ul,.float-view .content-page ul ul,.float-view .content-page ol ul,.float-view .content-page dl ul,.float-view .content-page h2 ul,.float-view .content-page h3 ul,.float-view .content-page h4 ul,.float-view .content-page h5 ul,.float-view .content-page h6 ul,.float-view .content-page .page-header ol,.float-view .content-page blockquote ol,.float-view .content-page p ol,.float-view .content-page ul ol,.float-view .content-page ol ol,.float-view .content-page dl ol,.float-view .content-page h2 ol,.float-view .content-page h3 ol,.float-view .content-page h4 ol,.float-view .content-page h5 ol,.float-view .content-page h6 ol,.float-view .content-page .page-header dl,.float-view .content-page blockquote dl,.float-view .content-page p dl,.float-view .content-page ul dl,.float-view .content-page ol dl,.float-view .content-page dl dl,.float-view .content-page h2 dl,.float-view .content-page h3 dl,.float-view .content-page h4 dl,.float-view .content-page h5 dl,.float-view .content-page h6 dl,.float-view .content-page .page-header h2,.float-view .content-page blockquote h2,.float-view .content-page p h2,.float-view .content-page ul h2,.float-view .content-page ol h2,.float-view .content-page dl h2,.float-view .content-page h2 h2,.float-view .content-page h3 h2,.float-view .content-page h4 h2,.float-view .content-page h5 h2,.float-view .content-page h6 h2,.float-view .content-page .page-header h3,.float-view .content-page blockquote h3,.float-view .content-page p h3,.float-view .content-page ul h3,.float-view .content-page ol h3,.float-view .content-page dl h3,.float-view .content-page h2 h3,.float-view .content-page h3 h3,.float-view .content-page h4 h3,.float-view .content-page h5 h3,.float-view .content-page h6 h3,.float-view .content-page .page-header h4,.float-view .content-page blockquote h4,.float-view .content-page p h4,.float-view .content-page ul h4,.float-view .content-page ol h4,.float-view .content-page dl h4,.float-view .content-page h2 h4,.float-view .content-page h3 h4,.float-view .content-page h4 h4,.float-view .content-page h5 h4,.float-view .content-page h6 h4,.float-view .content-page .page-header h5,.float-view .content-page blockquote h5,.float-view .content-page p h5,.float-view .content-page ul h5,.float-view .content-page ol h5,.float-view .content-page dl h5,.float-view .content-page h2 h5,.float-view .content-page h3 h5,.float-view .content-page h4 h5,.float-view .content-page h5 h5,.float-view .content-page h6 h5,.float-view .content-page .page-header h6,.float-view .content-page blockquote h6,.float-view .content-page p h6,.float-view .content-page ul h6,.float-view .content-page ol h6,.float-view .content-page dl h6,.float-view .content-page h2 h6,.float-view .content-page h3 h6,.float-view .content-page h4 h6,.float-view .content-page h5 h6,.float-view .content-page h6 h6,.float-view .content-page .page-header pre,.float-view .content-page blockquote pre,.float-view .content-page p pre,.float-view .content-page ul pre,.float-view .content-page ol pre,.float-view .content-page dl pre,.float-view .content-page h2 pre,.float-view .content-page h3 pre,.float-view .content-page h4 pre,.float-view .content-page h5 pre,.float-view .content-page h6 pre{float:none;display:block}.float-view .content-page ul li,.float-view .content-page ol li{margin-left:30px}.float-view .content-page pre{float:left;clear:right;width:47%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0 0 0 10px}}table{width:100%;border-bottom:1px solid #eee;margin-bottom:10px}table tr th,table tr td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #eee;border-left:1px solid #eee;border-color:#eee!important}table tr th:last-child,table tr td:last-child{border-right:1px solid #eee}.footer{position:fixed;bottom:0;left:0;padding:15px}#github-ribbon{position:absolute;top:50px;right:0;z-index:200}.well.well-sidebar{box-shadow:none;background-color:transparent;border-radius:0;border:none}.well.well-sidebar a{font-size:13px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#ecb5a1;line-height:28px}.well.well-sidebar .twitter hr{border-bottom:none;margin-left:-20px;margin-right:-20px}.editor{position:absolute;top:0;left:0;right:0;background:#fff;padding:20px;padding-bottom:100px;min-height:100%;height:auto;display:none}.editor h3{width:100%!important}.editor.paddingTop{padding-top:50px}#markdown_editor{width:85%;margin:0 auto;padding:10px;height:auto;font-size:16px;min-height:100px;font-family:"Ubuntu Mono",Consolas,monospace;display:block}.hljs{display:block;padding:.5em}.hljs,.hljs-subst,.hljs-tag .hljs-title,.hljs-lisp .hljs-title,.hljs-clojure .hljs-built_in,.hljs-nginx .hljs-title{color:#c64641}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value,.hljs-rules .hljs-value .hljs-number,.hljs-preprocessor,.hljs-ruby .hljs-symbol,.hljs-ruby .hljs-symbol .hljs-string,.hljs-aggregate,.hljs-template_tag,.hljs-django .hljs-variable,.hljs-smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-apache .hljs-cbracket,.hljs-tex .hljs-command,.hljs-tex .hljs-special,.hljs-erlang_repl .hljs-function_or_atom,.hljs-markdown .hljs-header{color:#557aa2}.hljs-comment,.hljs-annotation,.hljs-template_comment,.hljs-diff .hljs-header,.hljs-chunk,.hljs-markdown .hljs-blockquote{color:#ecdfd0}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-smalltalk .hljs-symbol,.hljs-smalltalk .hljs-char,.hljs-go .hljs-constant,.hljs-change,.hljs-markdown .hljs-bullet,.hljs-markdown .hljs-link_url{color:#9b2f7d}.hljs-label,.hljs-javadoc,.hljs-ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.hljs-apache .hljs-sqbracket,.hljs-nginx .hljs-built_in,.hljs-tex .hljs-formula,.hljs-erlang_repl .hljs-reserved,.hljs-prompt,.hljs-markdown .hljs-link_label,.hljs-vhdl .hljs-attribute,.hljs-clojure .hljs-attribute,.hljs-coffeescript .hljs-property{color:#a31621}.hljs-keyword,.hljs-id,.hljs-phpdoc,.hljs-title,.hljs-built_in,.hljs-aggregate,.hljs-css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-yardoctag,.hljs-smalltalk .hljs-class,.hljs-winutils,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-go .hljs-typename,.hljs-tex .hljs-command,.hljs-markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:700}.hljs-markdown .hljs-emphasis{font-style:italic}.hljs-nginx .hljs-built_in{font-weight:400}.hljs-coffeescript .hljs-javascript,.hljs-javascript .hljs-xml,.hljs-tex .hljs-formula,.hljs-xml .hljs-javascript,.hljs-xml .hljs-vbscript,.hljs-xml .hljs-css,.hljs-xml .hljs-cdata{opacity:.5} \ No newline at end of file + *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */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,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:0 0}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{-moz-box-sizing:content-box;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;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;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}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;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:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-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:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.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}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}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,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}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:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;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}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled,.homepage-footer.container-fluid .footer-nav{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:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}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:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}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}@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}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.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-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);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;-o-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:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@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 .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@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:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.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 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.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{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.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}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#969696}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);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:6px}.well-sm{padding:9px;border-radius:3px}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after{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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.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}tr.visible-sm{display:table-row!important}th.visible-sm,td.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}tr.visible-md{display:table-row!important}th.visible-md,td.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}tr.visible-lg{display:table-row!important}th.visible-lg,td.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}tr.visible-print{display:table-row!important}th.visible-print,td.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}}.roboto-slab.light{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:100}.roboto-slab.book{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}.roboto-slab.regular{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.roboto-slab.bold{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}h1,h2,h3,h4,h5,h6{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}pre{padding:0}.homepage-hero{padding-top:60px!important;background-color:#7795b4;box-shadow:none;border-radius:0;border:0;color:#13132a;overflow:hidden;padding-bottom:0;margin-bottom:0}.homepage-hero .text-center{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;margin:10px 0}.homepage-hero h2{margin:20px 0}.hero-buttons.container-fluid{padding:20px 0;background-color:#c5c5cb}.hero-buttons.container-fluid .btn-hero.btn{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;padding:20px 30px;background-image:none;filter:none;box-shadow:none;border-radius:0;text-shadow:none;border:0;opacity:.8;filter:alpha(opacity=80);margin:0 10px;text-transform:uppercase;border:5px solid #13132a}@media (max-width:767px){.hero-buttons.container-fluid .btn-hero.btn{display:block;margin-bottom:10px}}.hero-buttons.container-fluid .btn-hero.btn:hover{opacity:1;filter:alpha(opacity=100)}.hero-buttons.container-fluid .btn-hero.btn.btn-secondary{background-color:#c5c5cb;color:#13132a}.hero-buttons.container-fluid .btn-hero.btn.btn-primary{background-color:#13132a;color:#f5f5f6}.homepage-content.container-fluid{background-color:#fff;padding:40px 0}.homepage-content.container-fluid .lead{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.homepage-content.container-fluid ul,.homepage-content.container-fluid ol{padding:20px 0;margin:0 0 10px}.homepage-content.container-fluid ul li,.homepage-content.container-fluid ol li{list-style:none;padding-bottom:5px}.homepage-content.container-fluid ul li:before,.homepage-content.container-fluid ol li:before{content:'';width:0;height:0;border:3px solid transparent;border-left:3px solid #7795b4;float:left;display:block;margin:6px}@media (max-width:767px){.homepage-content.container-fluid{padding:40px 20px}}.homepage-footer.container-fluid{background-color:#13132a;box-shadow:none;border-radius:0;color:light;border:0}@media (max-width:767px){.homepage-footer.container-fluid{padding:0 20px}}.homepage-footer.container-fluid .footer-nav{margin:40px 0}.homepage-footer.container-fluid .footer-nav li a{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;font-size:16px;line-height:32px}.homepage-footer.container-fluid .footer-nav li a:hover{color:#7795b4;text-decoration:underline}.homepage-footer.container-fluid .twitter{margin-top:20px}.homepage-footer.container-fluid .twitter:first-child{margin-top:40px}html,body{margin:0;padding:0;height:100%;background-color:#7795b4;color:#2d2d2d}.container-fluid.fluid-height{height:100%}.columns{height:100%;padding-top:50px}.columns .left-column{background-color:#f5f5f6;border-right:1px solid #e7e7e9;overflow-x:hidden}.columns .right-column .content-page{padding:20px;min-height:100%;background-color:#fff}.content-area,.article-tree{overflow:auto;padding:0}@media (min-width:767px){.content-area,.article-tree{height:100%}}.responsive-collapse{padding:10px 15px;display:none;background-color:#e7e7e9;border-bottom:1px solid #e7e7e9}@media (max-width:767px){.responsive-collapse{display:block}}@media (max-width:768px){.sub-nav-collapse{display:none}}@media (min-width:768px){.sub-nav-collapse{display:block}}@media only screen and (max-width:800px){table,thead,tbody,th,td,tr{display:block;border:0}thead tr{position:absolute;top:-9999px;left:-9999px}tr{margin-bottom:10px;border-bottom:2px solid #ccc}tr td,tr th{border:1px solid #ccc;border-bottom:0}td{border:0;border-bottom:1px solid #eee;position:relative;padding-left:50%!important;white-space:normal;text-align:left}td:before{position:absolute;top:6px;left:6px;width:45%;padding-right:10px;white-space:nowrap;text-align:left;font-weight:700}td:before{content:attr(data-title)}}a{color:#7795b4}.btn.btn-sidebar{padding:7px 10px;background-image:none;filter:none;box-shadow:none;background-color:#c5c5cb;border:0}.btn.btn-sidebar .icon-bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#13132a;box-shadow:none}.btn.btn-sidebar:hover{box-shadow:none;background-color:#13132a}.btn.btn-sidebar:hover .icon-bar{background-color:#7795b4;box-shadow:none}code{color:#7795b4}.navbar{box-shadow:0 1px 5px rgba(0,0,0,.25);background-color:#13132a;margin-bottom:0;z-index:200}.navbar .container,.navbar .container-fluid{background-image:none;filter:none;border-bottom:0;padding:0 20px}.navbar .container .brand,.navbar .container-fluid .brand{color:#7795b4;text-shadow:none;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}.navbar .container .navbar-text,.navbar .container-fluid .navbar-text{color:#7795b4}.navbar .container .navbar-text a,.navbar .container-fluid .navbar-text a{color:#7795b4}@media (min-width:768px) and (max-width:979px){.navbar.navbar-fixed-top{position:fixed}}@media (max-width:767px){.navbar.navbar-fixed-top{margin-left:0;margin-right:0}}.nav.nav-list{padding-left:0;padding-right:0}.nav.nav-list li a{margin:0;padding:6px 15px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#13132a;font-size:15px;text-shadow:none;border-color:#e7e7e9}.nav.nav-list li a:hover{color:#13132a;text-shadow:none;background-color:#c5c5cb}.nav.nav-list li.active a{background-color:#c5c5cb}.nav.nav-list li.open>ul{display:block}.nav.nav-list li ul{display:none;margin-left:15px}.nav.nav-list li ul li a{font-weight:400;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:20px;margin:0;margin-left:-15px;padding:3px 30px;border:0;color:#2d2d2d;opacity:.7;filter:alpha(opacity=70)}.nav.nav-list li ul li a:hover{opacity:1;filter:alpha(opacity=100);background-color:transparent}.nav.nav-list li ul li.active a{color:#13132a}.page-header{margin:10px 0;padding:0}.page-header h1{margin-top:0}.page-header sub-heading{padding:0,0,20px}pre{border:0;background-color:#7795b4;border-radius:0;padding:10px;margin-left:-20px;padding-left:30px;margin-right:-20px;padding-right:30px}pre code{background:0 0;border:0}@media (min-width:1150px){.float-view .content-page{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.float-view .content-page article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.float-view .content-page article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.float-view .content-page table{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff;white-space:normal}.float-view .content-page table pre,.float-view .content-page table code{white-space:normal}.float-view .content-page .page-header{padding:0}.float-view .content-page .page-header,.float-view .content-page blockquote,.float-view .content-page p,.float-view .content-page ul,.float-view .content-page ol,.float-view .content-page dl,.float-view .content-page h2,.float-view .content-page h3,.float-view .content-page h4,.float-view .content-page h5,.float-view .content-page h6{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff}.float-view .content-page .page-header:before,.float-view .content-page blockquote:before,.float-view .content-page p:before,.float-view .content-page ul:before,.float-view .content-page ol:before,.float-view .content-page dl:before,.float-view .content-page h2:before,.float-view .content-page h3:before,.float-view .content-page h4:before,.float-view .content-page h5:before,.float-view .content-page h6:before{width:100%;height:10px;display:block;clear:both}.float-view .content-page .page-header p,.float-view .content-page blockquote p,.float-view .content-page p p,.float-view .content-page ul p,.float-view .content-page ol p,.float-view .content-page dl p,.float-view .content-page h2 p,.float-view .content-page h3 p,.float-view .content-page h4 p,.float-view .content-page h5 p,.float-view .content-page h6 p,.float-view .content-page .page-header ul,.float-view .content-page blockquote ul,.float-view .content-page p ul,.float-view .content-page ul ul,.float-view .content-page ol ul,.float-view .content-page dl ul,.float-view .content-page h2 ul,.float-view .content-page h3 ul,.float-view .content-page h4 ul,.float-view .content-page h5 ul,.float-view .content-page h6 ul,.float-view .content-page .page-header ol,.float-view .content-page blockquote ol,.float-view .content-page p ol,.float-view .content-page ul ol,.float-view .content-page ol ol,.float-view .content-page dl ol,.float-view .content-page h2 ol,.float-view .content-page h3 ol,.float-view .content-page h4 ol,.float-view .content-page h5 ol,.float-view .content-page h6 ol,.float-view .content-page .page-header dl,.float-view .content-page blockquote dl,.float-view .content-page p dl,.float-view .content-page ul dl,.float-view .content-page ol dl,.float-view .content-page dl dl,.float-view .content-page h2 dl,.float-view .content-page h3 dl,.float-view .content-page h4 dl,.float-view .content-page h5 dl,.float-view .content-page h6 dl,.float-view .content-page .page-header h2,.float-view .content-page blockquote h2,.float-view .content-page p h2,.float-view .content-page ul h2,.float-view .content-page ol h2,.float-view .content-page dl h2,.float-view .content-page h2 h2,.float-view .content-page h3 h2,.float-view .content-page h4 h2,.float-view .content-page h5 h2,.float-view .content-page h6 h2,.float-view .content-page .page-header h3,.float-view .content-page blockquote h3,.float-view .content-page p h3,.float-view .content-page ul h3,.float-view .content-page ol h3,.float-view .content-page dl h3,.float-view .content-page h2 h3,.float-view .content-page h3 h3,.float-view .content-page h4 h3,.float-view .content-page h5 h3,.float-view .content-page h6 h3,.float-view .content-page .page-header h4,.float-view .content-page blockquote h4,.float-view .content-page p h4,.float-view .content-page ul h4,.float-view .content-page ol h4,.float-view .content-page dl h4,.float-view .content-page h2 h4,.float-view .content-page h3 h4,.float-view .content-page h4 h4,.float-view .content-page h5 h4,.float-view .content-page h6 h4,.float-view .content-page .page-header h5,.float-view .content-page blockquote h5,.float-view .content-page p h5,.float-view .content-page ul h5,.float-view .content-page ol h5,.float-view .content-page dl h5,.float-view .content-page h2 h5,.float-view .content-page h3 h5,.float-view .content-page h4 h5,.float-view .content-page h5 h5,.float-view .content-page h6 h5,.float-view .content-page .page-header h6,.float-view .content-page blockquote h6,.float-view .content-page p h6,.float-view .content-page ul h6,.float-view .content-page ol h6,.float-view .content-page dl h6,.float-view .content-page h2 h6,.float-view .content-page h3 h6,.float-view .content-page h4 h6,.float-view .content-page h5 h6,.float-view .content-page h6 h6,.float-view .content-page .page-header pre,.float-view .content-page blockquote pre,.float-view .content-page p pre,.float-view .content-page ul pre,.float-view .content-page ol pre,.float-view .content-page dl pre,.float-view .content-page h2 pre,.float-view .content-page h3 pre,.float-view .content-page h4 pre,.float-view .content-page h5 pre,.float-view .content-page h6 pre{float:none;display:block}.float-view .content-page ul li,.float-view .content-page ol li{margin-left:30px}.float-view .content-page pre{float:left;clear:right;width:47%;border:0;border-left:10px solid #fff;margin:0 0 10px;padding:0 0 0 10px}}table{width:100%;border-bottom:1px solid #e7e7e9;margin-bottom:10px}table tr th,table tr td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #e7e7e9;border-left:1px solid #e7e7e9;border-color:#e7e7e9!important}table tr th:last-child,table tr td:last-child{border-right:1px solid #e7e7e9}.footer{position:fixed;bottom:0;left:0;padding:15px}#github-ribbon{position:absolute;top:50px;right:0;z-index:200}.well.well-sidebar{box-shadow:none;background-color:transparent;border-radius:0;border:0}.well.well-sidebar a{font-size:13px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#7795b4;line-height:28px}.well.well-sidebar .twitter hr{border-bottom:0;margin-left:-20px;margin-right:-20px}.editor{position:absolute;top:0;left:0;right:0;background:#fff;padding:20px;padding-bottom:100px;min-height:100%;height:auto;display:none}.editor h3{width:100%!important}.editor.paddingTop{padding-top:50px}#markdown_editor{width:85%;margin:0 auto;padding:10px;height:auto;font-size:16px;min-height:100px;font-family:"Ubuntu Mono",Consolas,monospace;display:block}.hljs{display:block;padding:.5em}.hljs,.hljs-subst,.hljs-tag .hljs-title,.hljs-lisp .hljs-title,.hljs-clojure .hljs-built_in,.hljs-nginx .hljs-title{color:#13132a}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value,.hljs-rules .hljs-value .hljs-number,.hljs-preprocessor,.hljs-ruby .hljs-symbol,.hljs-ruby .hljs-symbol .hljs-string,.hljs-aggregate,.hljs-template_tag,.hljs-django .hljs-variable,.hljs-smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-apache .hljs-cbracket,.hljs-tex .hljs-command,.hljs-tex .hljs-special,.hljs-erlang_repl .hljs-function_or_atom,.hljs-markdown .hljs-header{color:#000}.hljs-comment,.hljs-annotation,.hljs-template_comment,.hljs-diff .hljs-header,.hljs-chunk,.hljs-markdown .hljs-blockquote{color:#505050}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-smalltalk .hljs-symbol,.hljs-smalltalk .hljs-char,.hljs-go .hljs-constant,.hljs-change,.hljs-markdown .hljs-bullet,.hljs-markdown .hljs-link_url{color:#09559b}.hljs-label,.hljs-javadoc,.hljs-ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.hljs-apache .hljs-sqbracket,.hljs-nginx .hljs-built_in,.hljs-tex .hljs-formula,.hljs-erlang_repl .hljs-reserved,.hljs-prompt,.hljs-markdown .hljs-link_label,.hljs-vhdl .hljs-attribute,.hljs-clojure .hljs-attribute,.hljs-coffeescript .hljs-property{color:#001775}.hljs-keyword,.hljs-id,.hljs-phpdoc,.hljs-title,.hljs-built_in,.hljs-aggregate,.hljs-css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-yardoctag,.hljs-smalltalk .hljs-class,.hljs-winutils,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-go .hljs-typename,.hljs-tex .hljs-command,.hljs-markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:700}.hljs-markdown .hljs-emphasis{font-style:italic}.hljs-nginx .hljs-built_in{font-weight:400}.hljs-coffeescript .hljs-javascript,.hljs-javascript .hljs-xml,.hljs-tex .hljs-formula,.hljs-xml .hljs-javascript,.hljs-xml .hljs-vbscript,.hljs-xml .hljs-css,.hljs-xml .hljs-cdata{opacity:.5} \ No newline at end of file diff --git a/less/daux-navy.less b/templates/default/themes/daux-navy/less/theme.less similarity index 84% rename from less/daux-navy.less rename to templates/default/themes/daux-navy/less/theme.less index b806e38..c28f574 100644 --- a/less/daux-navy.less +++ b/templates/default/themes/daux-navy/less/theme.less @@ -10,4 +10,4 @@ @syntax-number: #09559b; @syntax-label: #001775; -@import "import/daux-base.less"; \ No newline at end of file +@import "../../_common/less/daux-base.less"; diff --git a/templates/default/themes/daux-red.thm b/templates/default/themes/daux-red/config.json similarity index 83% rename from templates/default/themes/daux-red.thm rename to templates/default/themes/daux-red/config.json index c0d799b..af7fde9 100644 --- a/templates/default/themes/daux-red.thm +++ b/templates/default/themes/daux-red/config.json @@ -1,8 +1,8 @@ { "favicon": "img/favicon-red.png", - "css": ["css/daux-red.css"], + "css": ["css/theme.min.css"], "fonts": ["//fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700&subset=latin,cyrillic-ext,cyrillic"], "js": [], "require-jquery": true, "bootstrap-js": false -} \ No newline at end of file +} diff --git a/templates/default/themes/daux-blue/css/daux-blue.css b/templates/default/themes/daux-red/css/theme.min.css similarity index 80% rename from templates/default/themes/daux-blue/css/daux-blue.css rename to templates/default/themes/daux-red/css/theme.min.css index 919ced8..5154c47 100644 --- a/templates/default/themes/daux-blue/css/daux-blue.css +++ b/templates/default/themes/daux-red/css/theme.min.css @@ -2,4 +2,4 @@ * DAUX.IO * http://daux.io/ * MIT License - *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */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,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:0 0}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{-moz-box-sizing:content-box;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;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;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}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;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:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-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:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.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}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}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,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}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:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;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}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled,.homepage-footer.container-fluid .footer-nav{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:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}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:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}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}@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}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.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-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);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;-o-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:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@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 .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@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:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.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 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.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{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.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}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#969696}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);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:6px}.well-sm{padding:9px;border-radius:3px}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after{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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.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}tr.visible-sm{display:table-row!important}th.visible-sm,td.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}tr.visible-md{display:table-row!important}th.visible-md,td.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}tr.visible-lg{display:table-row!important}th.visible-lg,td.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}tr.visible-print{display:table-row!important}th.visible-print,td.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}}.roboto-slab.light{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:100}.roboto-slab.book{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}.roboto-slab.regular{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.roboto-slab.bold{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}h1,h2,h3,h4,h5,h6{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}pre{padding:0}.homepage-hero{padding-top:60px!important;background-color:#82becd;box-shadow:none;border-radius:0;border:none;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0}.homepage-hero .text-center{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;margin:10px 0}.homepage-hero h2{margin:20px 0}.hero-buttons.container-fluid{padding:20px 0;background-color:#c5c5cb}.hero-buttons.container-fluid .btn-hero.btn{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;padding:20px 30px;background-image:none;filter:none;box-shadow:none;border-radius:0;text-shadow:none;border:none;opacity:.8;filter:alpha(opacity=80);margin:0 10px;text-transform:uppercase;border:5px solid #3f4657}@media (max-width:767px){.hero-buttons.container-fluid .btn-hero.btn{display:block;margin-bottom:10px}}.hero-buttons.container-fluid .btn-hero.btn:hover{opacity:1;filter:alpha(opacity=100)}.hero-buttons.container-fluid .btn-hero.btn.btn-secondary{background-color:#c5c5cb;color:#3f4657}.hero-buttons.container-fluid .btn-hero.btn.btn-primary{background-color:#3f4657;color:#f7f7f7}.homepage-content.container-fluid{background-color:#fff;padding:40px 0}.homepage-content.container-fluid .lead{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.homepage-content.container-fluid ul,.homepage-content.container-fluid ol{padding:20px 0;margin:0 0 10px}.homepage-content.container-fluid ul li,.homepage-content.container-fluid ol li{list-style:none;padding-bottom:5px}.homepage-content.container-fluid ul li:before,.homepage-content.container-fluid ol li:before{content:'';width:0;height:0;border:3px solid transparent;border-left:3px solid #82becd;float:left;display:block;margin:6px}@media (max-width:767px){.homepage-content.container-fluid{padding:40px 20px}}.homepage-footer.container-fluid{background-color:#3f4657;box-shadow:none;border-radius:0;color:light;border:none}@media (max-width:767px){.homepage-footer.container-fluid{padding:0 20px}}.homepage-footer.container-fluid .footer-nav{margin:40px 0}.homepage-footer.container-fluid .footer-nav li a{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;font-size:16px;line-height:32px}.homepage-footer.container-fluid .footer-nav li a:hover{color:#82becd;text-decoration:underline}.homepage-footer.container-fluid .twitter{margin-top:20px}.homepage-footer.container-fluid .twitter:first-child{margin-top:40px}html,body{margin:0;padding:0;height:100%;background-color:#82becd;color:#2d2d2d}.container-fluid.fluid-height{height:100%}.columns{height:100%;padding-top:50px}.columns .left-column{background-color:#f7f7f7;border-right:1px solid #e7e7e9;overflow-x:hidden}.columns .right-column .content-page{padding:20px;min-height:100%;background-color:#fff}.content-area,.article-tree{overflow:auto;padding:0}@media (min-width:767px){.content-area,.article-tree{height:100%}}.responsive-collapse{padding:10px 15px;display:none;background-color:#e7e7e9;border-bottom:1px solid #e7e7e9}@media (max-width:767px){.responsive-collapse{display:block}}@media (max-width:768px){.sub-nav-collapse{display:none}}@media (min-width:768px){.sub-nav-collapse{display:block}}@media only screen and (max-width:800px){table,thead,tbody,th,td,tr{display:block;border:none}thead tr{position:absolute;top:-9999px;left:-9999px}tr{margin-bottom:10px;border-bottom:2px solid #ccc}tr td,tr th{border:1px solid #ccc;border-bottom:none}td{border:none;border-bottom:1px solid #eee;position:relative;padding-left:50%!important;white-space:normal;text-align:left}td:before{position:absolute;top:6px;left:6px;width:45%;padding-right:10px;white-space:nowrap;text-align:left;font-weight:700}td:before{content:attr(data-title)}}a{color:#82becd}.btn.btn-sidebar{padding:7px 10px;background-image:none;filter:none;box-shadow:none;background-color:#c5c5cb;border:none}.btn.btn-sidebar .icon-bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#3f4657;box-shadow:none}.btn.btn-sidebar:hover{box-shadow:none;background-color:#3f4657}.btn.btn-sidebar:hover .icon-bar{background-color:#82becd;box-shadow:none}code{color:#82becd}.navbar{box-shadow:0 1px 5px rgba(0,0,0,.25);background-color:#3f4657;margin-bottom:0;z-index:200}.navbar .container,.navbar .container-fluid{background-image:none;filter:none;border-bottom:none;padding:0 20px}.navbar .container .brand,.navbar .container-fluid .brand{color:#82becd;text-shadow:none;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}.navbar .container .navbar-text,.navbar .container-fluid .navbar-text{color:#82becd}.navbar .container .navbar-text a,.navbar .container-fluid .navbar-text a{color:#82becd}@media (min-width:768px) and (max-width:979px){.navbar.navbar-fixed-top{position:fixed}}@media (max-width:767px){.navbar.navbar-fixed-top{margin-left:0;margin-right:0}}.nav.nav-list{padding-left:0;padding-right:0}.nav.nav-list li a{margin:0;padding:6px 15px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.nav.nav-list li a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.nav.nav-list li.active a{background-color:#c5c5cb}.nav.nav-list li.open>ul{display:block}.nav.nav-list li ul{display:none;margin-left:15px}.nav.nav-list li ul li a{font-weight:400;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:20px;margin:0;margin-left:-15px;padding:3px 30px;border:none;color:#2d2d2d;opacity:.7;filter:alpha(opacity=70)}.nav.nav-list li ul li a:hover{opacity:1;filter:alpha(opacity=100);background-color:transparent}.nav.nav-list li ul li.active a{color:#3f4657}.page-header{margin:10px 0;padding:0}.page-header h1{margin-top:0}.page-header sub-heading{padding:0,0,20px}pre{border:none;background-color:#82becd;border-radius:0;padding:10px;margin-left:-20px;padding-left:30px;margin-right:-20px;padding-right:30px}pre code{background:0 0;border:none}@media (min-width:1150px){.float-view .content-page{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.float-view .content-page article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.float-view .content-page article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.float-view .content-page table{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff;white-space:normal}.float-view .content-page table pre,.float-view .content-page table code{white-space:normal}.float-view .content-page .page-header{padding:0}.float-view .content-page .page-header,.float-view .content-page blockquote,.float-view .content-page p,.float-view .content-page ul,.float-view .content-page ol,.float-view .content-page dl,.float-view .content-page h2,.float-view .content-page h3,.float-view .content-page h4,.float-view .content-page h5,.float-view .content-page h6{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff}.float-view .content-page .page-header:before,.float-view .content-page blockquote:before,.float-view .content-page p:before,.float-view .content-page ul:before,.float-view .content-page ol:before,.float-view .content-page dl:before,.float-view .content-page h2:before,.float-view .content-page h3:before,.float-view .content-page h4:before,.float-view .content-page h5:before,.float-view .content-page h6:before{width:100%;height:10px;display:block;clear:both}.float-view .content-page .page-header p,.float-view .content-page blockquote p,.float-view .content-page p p,.float-view .content-page ul p,.float-view .content-page ol p,.float-view .content-page dl p,.float-view .content-page h2 p,.float-view .content-page h3 p,.float-view .content-page h4 p,.float-view .content-page h5 p,.float-view .content-page h6 p,.float-view .content-page .page-header ul,.float-view .content-page blockquote ul,.float-view .content-page p ul,.float-view .content-page ul ul,.float-view .content-page ol ul,.float-view .content-page dl ul,.float-view .content-page h2 ul,.float-view .content-page h3 ul,.float-view .content-page h4 ul,.float-view .content-page h5 ul,.float-view .content-page h6 ul,.float-view .content-page .page-header ol,.float-view .content-page blockquote ol,.float-view .content-page p ol,.float-view .content-page ul ol,.float-view .content-page ol ol,.float-view .content-page dl ol,.float-view .content-page h2 ol,.float-view .content-page h3 ol,.float-view .content-page h4 ol,.float-view .content-page h5 ol,.float-view .content-page h6 ol,.float-view .content-page .page-header dl,.float-view .content-page blockquote dl,.float-view .content-page p dl,.float-view .content-page ul dl,.float-view .content-page ol dl,.float-view .content-page dl dl,.float-view .content-page h2 dl,.float-view .content-page h3 dl,.float-view .content-page h4 dl,.float-view .content-page h5 dl,.float-view .content-page h6 dl,.float-view .content-page .page-header h2,.float-view .content-page blockquote h2,.float-view .content-page p h2,.float-view .content-page ul h2,.float-view .content-page ol h2,.float-view .content-page dl h2,.float-view .content-page h2 h2,.float-view .content-page h3 h2,.float-view .content-page h4 h2,.float-view .content-page h5 h2,.float-view .content-page h6 h2,.float-view .content-page .page-header h3,.float-view .content-page blockquote h3,.float-view .content-page p h3,.float-view .content-page ul h3,.float-view .content-page ol h3,.float-view .content-page dl h3,.float-view .content-page h2 h3,.float-view .content-page h3 h3,.float-view .content-page h4 h3,.float-view .content-page h5 h3,.float-view .content-page h6 h3,.float-view .content-page .page-header h4,.float-view .content-page blockquote h4,.float-view .content-page p h4,.float-view .content-page ul h4,.float-view .content-page ol h4,.float-view .content-page dl h4,.float-view .content-page h2 h4,.float-view .content-page h3 h4,.float-view .content-page h4 h4,.float-view .content-page h5 h4,.float-view .content-page h6 h4,.float-view .content-page .page-header h5,.float-view .content-page blockquote h5,.float-view .content-page p h5,.float-view .content-page ul h5,.float-view .content-page ol h5,.float-view .content-page dl h5,.float-view .content-page h2 h5,.float-view .content-page h3 h5,.float-view .content-page h4 h5,.float-view .content-page h5 h5,.float-view .content-page h6 h5,.float-view .content-page .page-header h6,.float-view .content-page blockquote h6,.float-view .content-page p h6,.float-view .content-page ul h6,.float-view .content-page ol h6,.float-view .content-page dl h6,.float-view .content-page h2 h6,.float-view .content-page h3 h6,.float-view .content-page h4 h6,.float-view .content-page h5 h6,.float-view .content-page h6 h6,.float-view .content-page .page-header pre,.float-view .content-page blockquote pre,.float-view .content-page p pre,.float-view .content-page ul pre,.float-view .content-page ol pre,.float-view .content-page dl pre,.float-view .content-page h2 pre,.float-view .content-page h3 pre,.float-view .content-page h4 pre,.float-view .content-page h5 pre,.float-view .content-page h6 pre{float:none;display:block}.float-view .content-page ul li,.float-view .content-page ol li{margin-left:30px}.float-view .content-page pre{float:left;clear:right;width:47%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0 0 0 10px}}table{width:100%;border-bottom:1px solid #e7e7e9;margin-bottom:10px}table tr th,table tr td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #e7e7e9;border-left:1px solid #e7e7e9;border-color:#e7e7e9!important}table tr th:last-child,table tr td:last-child{border-right:1px solid #e7e7e9}.footer{position:fixed;bottom:0;left:0;padding:15px}#github-ribbon{position:absolute;top:50px;right:0;z-index:200}.well.well-sidebar{box-shadow:none;background-color:transparent;border-radius:0;border:none}.well.well-sidebar a{font-size:13px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#82becd;line-height:28px}.well.well-sidebar .twitter hr{border-bottom:none;margin-left:-20px;margin-right:-20px}.editor{position:absolute;top:0;left:0;right:0;background:#fff;padding:20px;padding-bottom:100px;min-height:100%;height:auto;display:none}.editor h3{width:100%!important}.editor.paddingTop{padding-top:50px}#markdown_editor{width:85%;margin:0 auto;padding:10px;height:auto;font-size:16px;min-height:100px;font-family:"Ubuntu Mono",Consolas,monospace;display:block}.hljs{display:block;padding:.5em}.hljs,.hljs-subst,.hljs-tag .hljs-title,.hljs-lisp .hljs-title,.hljs-clojure .hljs-built_in,.hljs-nginx .hljs-title{color:#3f4657}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value,.hljs-rules .hljs-value .hljs-number,.hljs-preprocessor,.hljs-ruby .hljs-symbol,.hljs-ruby .hljs-symbol .hljs-string,.hljs-aggregate,.hljs-template_tag,.hljs-django .hljs-variable,.hljs-smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-apache .hljs-cbracket,.hljs-tex .hljs-command,.hljs-tex .hljs-special,.hljs-erlang_repl .hljs-function_or_atom,.hljs-markdown .hljs-header{color:#022e99}.hljs-comment,.hljs-annotation,.hljs-template_comment,.hljs-diff .hljs-header,.hljs-chunk,.hljs-markdown .hljs-blockquote{color:#84989b}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-smalltalk .hljs-symbol,.hljs-smalltalk .hljs-char,.hljs-go .hljs-constant,.hljs-change,.hljs-markdown .hljs-bullet,.hljs-markdown .hljs-link_url{color:#2f9b92}.hljs-label,.hljs-javadoc,.hljs-ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.hljs-apache .hljs-sqbracket,.hljs-nginx .hljs-built_in,.hljs-tex .hljs-formula,.hljs-erlang_repl .hljs-reserved,.hljs-prompt,.hljs-markdown .hljs-link_label,.hljs-vhdl .hljs-attribute,.hljs-clojure .hljs-attribute,.hljs-coffeescript .hljs-property{color:#840d7a}.hljs-keyword,.hljs-id,.hljs-phpdoc,.hljs-title,.hljs-built_in,.hljs-aggregate,.hljs-css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-yardoctag,.hljs-smalltalk .hljs-class,.hljs-winutils,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-go .hljs-typename,.hljs-tex .hljs-command,.hljs-markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:700}.hljs-markdown .hljs-emphasis{font-style:italic}.hljs-nginx .hljs-built_in{font-weight:400}.hljs-coffeescript .hljs-javascript,.hljs-javascript .hljs-xml,.hljs-tex .hljs-formula,.hljs-xml .hljs-javascript,.hljs-xml .hljs-vbscript,.hljs-xml .hljs-css,.hljs-xml .hljs-cdata{opacity:.5} \ No newline at end of file + *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */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,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:0 0}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{-moz-box-sizing:content-box;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;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;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}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;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:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-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:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.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}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}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,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}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:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;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}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled,.homepage-footer.container-fluid .footer-nav{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:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}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:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}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}@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}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.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-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);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;-o-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:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@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 .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@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:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.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 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.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{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.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}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#969696}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);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:6px}.well-sm{padding:9px;border-radius:3px}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after{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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.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}tr.visible-sm{display:table-row!important}th.visible-sm,td.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}tr.visible-md{display:table-row!important}th.visible-md,td.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}tr.visible-lg{display:table-row!important}th.visible-lg,td.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}tr.visible-print{display:table-row!important}th.visible-print,td.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}}.roboto-slab.light{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:100}.roboto-slab.book{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}.roboto-slab.regular{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.roboto-slab.bold{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}h1,h2,h3,h4,h5,h6{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}pre{padding:0}.homepage-hero{padding-top:60px!important;background-color:#ecb5a1;box-shadow:none;border-radius:0;border:0;color:#c64641;overflow:hidden;padding-bottom:0;margin-bottom:0}.homepage-hero .text-center{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;margin:10px 0}.homepage-hero h2{margin:20px 0}.hero-buttons.container-fluid{padding:20px 0;background-color:#eee}.hero-buttons.container-fluid .btn-hero.btn{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;padding:20px 30px;background-image:none;filter:none;box-shadow:none;border-radius:0;text-shadow:none;border:0;opacity:.8;filter:alpha(opacity=80);margin:0 10px;text-transform:uppercase;border:5px solid #c64641}@media (max-width:767px){.hero-buttons.container-fluid .btn-hero.btn{display:block;margin-bottom:10px}}.hero-buttons.container-fluid .btn-hero.btn:hover{opacity:1;filter:alpha(opacity=100)}.hero-buttons.container-fluid .btn-hero.btn.btn-secondary{background-color:#eee;color:#c64641}.hero-buttons.container-fluid .btn-hero.btn.btn-primary{background-color:#c64641;color:#f7f7f7}.homepage-content.container-fluid{background-color:#fff;padding:40px 0}.homepage-content.container-fluid .lead{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.homepage-content.container-fluid ul,.homepage-content.container-fluid ol{padding:20px 0;margin:0 0 10px}.homepage-content.container-fluid ul li,.homepage-content.container-fluid ol li{list-style:none;padding-bottom:5px}.homepage-content.container-fluid ul li:before,.homepage-content.container-fluid ol li:before{content:'';width:0;height:0;border:3px solid transparent;border-left:3px solid #ecb5a1;float:left;display:block;margin:6px}@media (max-width:767px){.homepage-content.container-fluid{padding:40px 20px}}.homepage-footer.container-fluid{background-color:#c64641;box-shadow:none;border-radius:0;color:light;border:0}@media (max-width:767px){.homepage-footer.container-fluid{padding:0 20px}}.homepage-footer.container-fluid .footer-nav{margin:40px 0}.homepage-footer.container-fluid .footer-nav li a{font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;font-size:16px;line-height:32px}.homepage-footer.container-fluid .footer-nav li a:hover{color:#ecb5a1;text-decoration:underline}.homepage-footer.container-fluid .twitter{margin-top:20px}.homepage-footer.container-fluid .twitter:first-child{margin-top:40px}html,body{margin:0;padding:0;height:100%;background-color:#ecb5a1;color:#2d2d2d}.container-fluid.fluid-height{height:100%}.columns{height:100%;padding-top:50px}.columns .left-column{background-color:#f7f7f7;border-right:1px solid #eee;overflow-x:hidden}.columns .right-column .content-page{padding:20px;min-height:100%;background-color:#fff}.content-area,.article-tree{overflow:auto;padding:0}@media (min-width:767px){.content-area,.article-tree{height:100%}}.responsive-collapse{padding:10px 15px;display:none;background-color:#eee;border-bottom:1px solid #eee}@media (max-width:767px){.responsive-collapse{display:block}}@media (max-width:768px){.sub-nav-collapse{display:none}}@media (min-width:768px){.sub-nav-collapse{display:block}}@media only screen and (max-width:800px){table,thead,tbody,th,td,tr{display:block;border:0}thead tr{position:absolute;top:-9999px;left:-9999px}tr{margin-bottom:10px;border-bottom:2px solid #ccc}tr td,tr th{border:1px solid #ccc;border-bottom:0}td{border:0;border-bottom:1px solid #eee;position:relative;padding-left:50%!important;white-space:normal;text-align:left}td:before{position:absolute;top:6px;left:6px;width:45%;padding-right:10px;white-space:nowrap;text-align:left;font-weight:700}td:before{content:attr(data-title)}}a{color:#ecb5a1}.btn.btn-sidebar{padding:7px 10px;background-image:none;filter:none;box-shadow:none;background-color:#eee;border:0}.btn.btn-sidebar .icon-bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#c64641;box-shadow:none}.btn.btn-sidebar:hover{box-shadow:none;background-color:#c64641}.btn.btn-sidebar:hover .icon-bar{background-color:#ecb5a1;box-shadow:none}code{color:#ecb5a1}.navbar{box-shadow:0 1px 5px rgba(0,0,0,.25);background-color:#c64641;margin-bottom:0;z-index:200}.navbar .container,.navbar .container-fluid{background-image:none;filter:none;border-bottom:0;padding:0 20px}.navbar .container .brand,.navbar .container-fluid .brand{color:#ecb5a1;text-shadow:none;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}.navbar .container .navbar-text,.navbar .container-fluid .navbar-text{color:#ecb5a1}.navbar .container .navbar-text a,.navbar .container-fluid .navbar-text a{color:#ecb5a1}@media (min-width:768px) and (max-width:979px){.navbar.navbar-fixed-top{position:fixed}}@media (max-width:767px){.navbar.navbar-fixed-top{margin-left:0;margin-right:0}}.nav.nav-list{padding-left:0;padding-right:0}.nav.nav-list li a{margin:0;padding:6px 15px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#c64641;font-size:15px;text-shadow:none;border-color:#eee}.nav.nav-list li a:hover{color:#c64641;text-shadow:none;background-color:#eee}.nav.nav-list li.active a{background-color:#eee}.nav.nav-list li.open>ul{display:block}.nav.nav-list li ul{display:none;margin-left:15px}.nav.nav-list li ul li a{font-weight:400;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:20px;margin:0;margin-left:-15px;padding:3px 30px;border:0;color:#2d2d2d;opacity:.7;filter:alpha(opacity=70)}.nav.nav-list li ul li a:hover{opacity:1;filter:alpha(opacity=100);background-color:transparent}.nav.nav-list li ul li.active a{color:#c64641}.page-header{margin:10px 0;padding:0}.page-header h1{margin-top:0}.page-header sub-heading{padding:0,0,20px}pre{border:0;background-color:#ecb5a1;border-radius:0;padding:10px;margin-left:-20px;padding-left:30px;margin-right:-20px;padding-right:30px}pre code{background:0 0;border:0}@media (min-width:1150px){.float-view .content-page{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.float-view .content-page article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.float-view .content-page article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.float-view .content-page table{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff;white-space:normal}.float-view .content-page table pre,.float-view .content-page table code{white-space:normal}.float-view .content-page .page-header{padding:0}.float-view .content-page .page-header,.float-view .content-page blockquote,.float-view .content-page p,.float-view .content-page ul,.float-view .content-page ol,.float-view .content-page dl,.float-view .content-page h2,.float-view .content-page h3,.float-view .content-page h4,.float-view .content-page h5,.float-view .content-page h6{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%;background-color:#fff}.float-view .content-page .page-header:before,.float-view .content-page blockquote:before,.float-view .content-page p:before,.float-view .content-page ul:before,.float-view .content-page ol:before,.float-view .content-page dl:before,.float-view .content-page h2:before,.float-view .content-page h3:before,.float-view .content-page h4:before,.float-view .content-page h5:before,.float-view .content-page h6:before{width:100%;height:10px;display:block;clear:both}.float-view .content-page .page-header p,.float-view .content-page blockquote p,.float-view .content-page p p,.float-view .content-page ul p,.float-view .content-page ol p,.float-view .content-page dl p,.float-view .content-page h2 p,.float-view .content-page h3 p,.float-view .content-page h4 p,.float-view .content-page h5 p,.float-view .content-page h6 p,.float-view .content-page .page-header ul,.float-view .content-page blockquote ul,.float-view .content-page p ul,.float-view .content-page ul ul,.float-view .content-page ol ul,.float-view .content-page dl ul,.float-view .content-page h2 ul,.float-view .content-page h3 ul,.float-view .content-page h4 ul,.float-view .content-page h5 ul,.float-view .content-page h6 ul,.float-view .content-page .page-header ol,.float-view .content-page blockquote ol,.float-view .content-page p ol,.float-view .content-page ul ol,.float-view .content-page ol ol,.float-view .content-page dl ol,.float-view .content-page h2 ol,.float-view .content-page h3 ol,.float-view .content-page h4 ol,.float-view .content-page h5 ol,.float-view .content-page h6 ol,.float-view .content-page .page-header dl,.float-view .content-page blockquote dl,.float-view .content-page p dl,.float-view .content-page ul dl,.float-view .content-page ol dl,.float-view .content-page dl dl,.float-view .content-page h2 dl,.float-view .content-page h3 dl,.float-view .content-page h4 dl,.float-view .content-page h5 dl,.float-view .content-page h6 dl,.float-view .content-page .page-header h2,.float-view .content-page blockquote h2,.float-view .content-page p h2,.float-view .content-page ul h2,.float-view .content-page ol h2,.float-view .content-page dl h2,.float-view .content-page h2 h2,.float-view .content-page h3 h2,.float-view .content-page h4 h2,.float-view .content-page h5 h2,.float-view .content-page h6 h2,.float-view .content-page .page-header h3,.float-view .content-page blockquote h3,.float-view .content-page p h3,.float-view .content-page ul h3,.float-view .content-page ol h3,.float-view .content-page dl h3,.float-view .content-page h2 h3,.float-view .content-page h3 h3,.float-view .content-page h4 h3,.float-view .content-page h5 h3,.float-view .content-page h6 h3,.float-view .content-page .page-header h4,.float-view .content-page blockquote h4,.float-view .content-page p h4,.float-view .content-page ul h4,.float-view .content-page ol h4,.float-view .content-page dl h4,.float-view .content-page h2 h4,.float-view .content-page h3 h4,.float-view .content-page h4 h4,.float-view .content-page h5 h4,.float-view .content-page h6 h4,.float-view .content-page .page-header h5,.float-view .content-page blockquote h5,.float-view .content-page p h5,.float-view .content-page ul h5,.float-view .content-page ol h5,.float-view .content-page dl h5,.float-view .content-page h2 h5,.float-view .content-page h3 h5,.float-view .content-page h4 h5,.float-view .content-page h5 h5,.float-view .content-page h6 h5,.float-view .content-page .page-header h6,.float-view .content-page blockquote h6,.float-view .content-page p h6,.float-view .content-page ul h6,.float-view .content-page ol h6,.float-view .content-page dl h6,.float-view .content-page h2 h6,.float-view .content-page h3 h6,.float-view .content-page h4 h6,.float-view .content-page h5 h6,.float-view .content-page h6 h6,.float-view .content-page .page-header pre,.float-view .content-page blockquote pre,.float-view .content-page p pre,.float-view .content-page ul pre,.float-view .content-page ol pre,.float-view .content-page dl pre,.float-view .content-page h2 pre,.float-view .content-page h3 pre,.float-view .content-page h4 pre,.float-view .content-page h5 pre,.float-view .content-page h6 pre{float:none;display:block}.float-view .content-page ul li,.float-view .content-page ol li{margin-left:30px}.float-view .content-page pre{float:left;clear:right;width:47%;border:0;border-left:10px solid #fff;margin:0 0 10px;padding:0 0 0 10px}}table{width:100%;border-bottom:1px solid #eee;margin-bottom:10px}table tr th,table tr td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #eee;border-left:1px solid #eee;border-color:#eee!important}table tr th:last-child,table tr td:last-child{border-right:1px solid #eee}.footer{position:fixed;bottom:0;left:0;padding:15px}#github-ribbon{position:absolute;top:50px;right:0;z-index:200}.well.well-sidebar{box-shadow:none;background-color:transparent;border-radius:0;border:0}.well.well-sidebar a{font-size:13px;font-family:'Roboto Slab',"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;color:#ecb5a1;line-height:28px}.well.well-sidebar .twitter hr{border-bottom:0;margin-left:-20px;margin-right:-20px}.editor{position:absolute;top:0;left:0;right:0;background:#fff;padding:20px;padding-bottom:100px;min-height:100%;height:auto;display:none}.editor h3{width:100%!important}.editor.paddingTop{padding-top:50px}#markdown_editor{width:85%;margin:0 auto;padding:10px;height:auto;font-size:16px;min-height:100px;font-family:"Ubuntu Mono",Consolas,monospace;display:block}.hljs{display:block;padding:.5em}.hljs,.hljs-subst,.hljs-tag .hljs-title,.hljs-lisp .hljs-title,.hljs-clojure .hljs-built_in,.hljs-nginx .hljs-title{color:#c64641}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value,.hljs-rules .hljs-value .hljs-number,.hljs-preprocessor,.hljs-ruby .hljs-symbol,.hljs-ruby .hljs-symbol .hljs-string,.hljs-aggregate,.hljs-template_tag,.hljs-django .hljs-variable,.hljs-smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-apache .hljs-cbracket,.hljs-tex .hljs-command,.hljs-tex .hljs-special,.hljs-erlang_repl .hljs-function_or_atom,.hljs-markdown .hljs-header{color:#557aa2}.hljs-comment,.hljs-annotation,.hljs-template_comment,.hljs-diff .hljs-header,.hljs-chunk,.hljs-markdown .hljs-blockquote{color:#ecdfd0}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-smalltalk .hljs-symbol,.hljs-smalltalk .hljs-char,.hljs-go .hljs-constant,.hljs-change,.hljs-markdown .hljs-bullet,.hljs-markdown .hljs-link_url{color:#9b2f7d}.hljs-label,.hljs-javadoc,.hljs-ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.hljs-apache .hljs-sqbracket,.hljs-nginx .hljs-built_in,.hljs-tex .hljs-formula,.hljs-erlang_repl .hljs-reserved,.hljs-prompt,.hljs-markdown .hljs-link_label,.hljs-vhdl .hljs-attribute,.hljs-clojure .hljs-attribute,.hljs-coffeescript .hljs-property{color:#a31621}.hljs-keyword,.hljs-id,.hljs-phpdoc,.hljs-title,.hljs-built_in,.hljs-aggregate,.hljs-css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-yardoctag,.hljs-smalltalk .hljs-class,.hljs-winutils,.hljs-bash .hljs-variable,.hljs-apache .hljs-tag,.hljs-go .hljs-typename,.hljs-tex .hljs-command,.hljs-markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:700}.hljs-markdown .hljs-emphasis{font-style:italic}.hljs-nginx .hljs-built_in{font-weight:400}.hljs-coffeescript .hljs-javascript,.hljs-javascript .hljs-xml,.hljs-tex .hljs-formula,.hljs-xml .hljs-javascript,.hljs-xml .hljs-vbscript,.hljs-xml .hljs-css,.hljs-xml .hljs-cdata{opacity:.5} \ No newline at end of file diff --git a/less/daux-red.less b/templates/default/themes/daux-red/less/theme.less similarity index 84% rename from less/daux-red.less rename to templates/default/themes/daux-red/less/theme.less index 0d38666..217d9f0 100644 --- a/less/daux-red.less +++ b/templates/default/themes/daux-red/less/theme.less @@ -10,4 +10,4 @@ @syntax-number: #9b2f7d; @syntax-label: #a31621; -@import "import/daux-base.less"; \ No newline at end of file +@import "../../_common/less/daux-base.less"; From c79c692042df4b779c3d651056d1c114573f6d72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Wed, 22 Apr 2015 12:23:57 +0200 Subject: [PATCH 003/127] Separate generator and server --- generate.php | 17 +- index.php | 11 +- libs/Daux.php | 377 ++++++++++-------------------- libs/DauxHelper.php | 176 ++------------ libs/Entry.php | 1 + libs/Exception.php | 5 + libs/Generator/Generator.php | 46 ++++ libs/Generator/Helper.php | 79 +++++++ libs/{ => Server}/ErrorPage.php | 4 +- libs/Server/Helper.php | 84 +++++++ libs/Server/NotFoundException.php | 7 + libs/Server/Server.php | 85 +++++++ 12 files changed, 458 insertions(+), 434 deletions(-) create mode 100644 libs/Exception.php create mode 100644 libs/Generator/Generator.php create mode 100644 libs/Generator/Helper.php rename libs/{ => Server}/ErrorPage.php (95%) create mode 100644 libs/Server/Helper.php create mode 100644 libs/Server/NotFoundException.php create mode 100644 libs/Server/Server.php diff --git a/generate.php b/generate.php index 13afe2d..2b5589e 100644 --- a/generate.php +++ b/generate.php @@ -1,6 +1,4 @@ initialize(); - if (isset($argv[2])) $Daux->generate_static($argv[2]); - else $Daux->generate_static(); -?> + +require_once("vendor/autoload.php"); + +$global_config = (isset($argv[1]))? $argv[1] : null; +$destination = (isset($argv[2]))? $argv[2] : null; + +$generator = new \Todaymade\Daux\Generator\Generator(); + +$generator->generate($global_config, $destination); diff --git a/index.php b/index.php index bd3769f..3f52913 100644 --- a/index.php +++ b/index.php @@ -1,6 +1,4 @@ initialize(); - $page = $Daux->handle_request($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], $_REQUEST); - $page->display(); -?> + +require_once("vendor/autoload.php"); + +\Todaymade\Daux\Server\Server::serve($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], $_REQUEST); diff --git a/libs/Daux.php b/libs/Daux.php index dccd143..176ab18 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -1,108 +1,61 @@ initial_setup($global_config_file); - } + public function __construct($mode) { + $this->mode = $mode; - public function initialize($config_file = 'config.json') { - if ($this->error) return; - $this->load_docs_config($config_file); - $this->generate_directory_tree(); - if (!$this->error) $this->params = $this->get_page_params(); - } - - public function generate_static($output_dir = NULL) { - if (is_null($output_dir)) $output_dir = $this->local_base . DIRECTORY_SEPARATOR . 'static'; - DauxHelper::clean_copy_assets($output_dir, $this->local_base); - $this->recursive_generate_static($this->tree, $output_dir, $this->params); - } - - public function handle_request($url, $query = array()) { - if ($this->error) return $this->error_page; - if (!$this->params['clean_urls']) $this->params['base_page'] .= 'index.php/'; - $request = DauxHelper::get_request(); - $request = urldecode($request); - $request_type = isset($query['method']) ? $query['method'] : ''; - if($request == 'first_page') { - $request = $this->tree->first_page->uri; - } - switch ($request_type) { - case 'DauxEdit': - if ($this->options['file_editor']) { - $content = isset($query['markdown']) ? $query['markdown'] : ''; - return $this->save_file($request, $content); - } - return $this->generate_error_page('Editing Disabled', 'Editing is currently disabled in config', - ErrorPage::FATAL_ERROR_TYPE); - default: - return $this->get_page($request); - } - } - - private function initial_setup($global_config_file) { - $this->setup_environment_variables(); - $this->load_global_config($global_config_file); - } - - private function setup_environment_variables() { - global $argc; $this->local_base = dirname(dirname(__FILE__)); $this->base_url = ''; - if (isset($argc)) { - $this->mode = Daux::STATIC_MODE; - return; + + if ($this->mode == Daux::LIVE_MODE) { + $this->host = $_SERVER['HTTP_HOST']; + $this->base_url = $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']); + $t = strrpos($this->base_url, '/index.php'); + if ($t != FALSE) $this->base_url = substr($this->base_url, 0, $t); + if (substr($this->base_url, -1) !== '/') $this->base_url .= '/'; } - $this->mode = Daux::LIVE_MODE; - $this->host = $_SERVER['HTTP_HOST']; - $this->base_url = $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']); - $t = strrpos($this->base_url, '/index.php'); - if ($t != FALSE) $this->base_url = substr($this->base_url, 0, $t); - if (substr($this->base_url, -1) !== '/') $this->base_url .= '/'; + } + + public function initialize($global_config_file = null, $config_file = 'config.json') { + $this->load_global_config($global_config_file); + $this->load_docs_config($config_file); + $this->generate_directory_tree(); } private function load_global_config($global_config_file) { if (is_null($global_config_file)) $global_config_file = $this->local_base . DIRECTORY_SEPARATOR . 'global.json'; if (!file_exists($global_config_file)) { - $this->generate_error_page('Global Config File Missing', - 'The Global Config file is missing. Requested File : ' . $global_config_file, ErrorPage::FATAL_ERROR_TYPE); - return; + throw new Exception('The Global Config file is missing. Requested File : ' . $global_config_file); } $global_config = json_decode(file_get_contents($global_config_file), true); if (!isset($global_config)) { - $this->generate_error_page('Corrupt Global Config File', - 'The Global Config file is corrupt. Check that the JSON encoding is correct', ErrorPage::FATAL_ERROR_TYPE); - return; + throw new Exception('The Global Config file is corrupt. Check that the JSON encoding is correct'); } if (!isset($global_config['docs_directory'])) { - $this->generate_error_page('Docs Directory not set', 'The Global Config file does not have the docs directory set.', - ErrorPage::FATAL_ERROR_TYPE); - return; + throw new Exception('The Global Config file does not have the docs directory set.'); } $this->docs_path = $global_config['docs_directory']; if (!is_dir($this->docs_path) && !is_dir($this->docs_path = $this->local_base . DIRECTORY_SEPARATOR . $this->docs_path)) { - $this->generate_error_page('Docs Directory not found', - 'The Docs directory does not exist. Check the path again : ' . $this->docs_path, ErrorPage::FATAL_ERROR_TYPE); - return; + throw new Exception('The Docs directory does not exist. Check the path again : ' . $this->docs_path); } if (!isset($global_config['valid_markdown_extensions'])) static::$VALID_MARKDOWN_EXTENSIONS = array('md', 'markdown'); @@ -112,17 +65,13 @@ private function load_docs_config($config_file) { $config_file = $this->docs_path . DIRECTORY_SEPARATOR . $config_file; if (!file_exists($config_file)) { - $this->generate_error_page('Config File Missing', - 'The local config file is missing. Check path : ' . $config_file, ErrorPage::FATAL_ERROR_TYPE); - return; + throw new Exception('The local config file is missing. Check path : ' . $config_file); } $this->options = json_decode(file_get_contents($this->local_base . DIRECTORY_SEPARATOR . 'default.json'), true); if (is_file($config_file)) { $config = json_decode(file_get_contents($config_file), true); if (!isset($config)) { - $this->generate_error_page('Invalid Config File', - 'There was an error parsing the Config file. Please review', ErrorPage::FATAL_ERROR_TYPE); - return; + throw new Exception('There was an error parsing the Config file. Please review'); } $this->options = array_merge($this->options, $config); } @@ -139,197 +88,105 @@ } } - private function recursive_generate_static($tree, $output_dir, $params, $base_url = '') { - $params['base_url'] = $params['base_page'] = $base_url; - $new_params = $params; - //changed this as well in order for the templates to be put in the right place - $params['theme'] = DauxHelper::rebase_theme($params['theme'], $base_url, $params['base_url'] . "templates/default/themes/" . $params['theme']['name'] . '/'); - // - $params['image'] = str_replace('', $base_url, $params['image']); - if ($base_url !== '') $params['entry_page'] = $tree->first_page; - foreach ($tree->value as $key => $node) { - if ($node->type === Entry::DIRECTORY_TYPE) { - $new_output_dir = $output_dir . DIRECTORY_SEPARATOR . $key; - @mkdir($new_output_dir); - $this->recursive_generate_static($node, $new_output_dir, $new_params, '../' . $base_url); - } else { - $params['request'] = $node->get_url(); - $params['file_uri'] = $node->name; + public function get_base_params() { + return array( + 'local_base' => $this->local_base, - $page = MarkdownPage::fromFile($node, $params); - file_put_contents($output_dir . DIRECTORY_SEPARATOR . $key, $page->get_page_content()); - } - } + 'tagline' => $this->options['tagline'], + 'title' => $this->options['title'], + 'author' => $this->options['author'], + 'image' => $this->options['image'], + 'repo' => $this->options['repo'], + 'links' => $this->options['links'], + 'twitter' => $this->options['twitter'], + 'google_analytics' => ($g = $this->options['google_analytics']) ? DauxHelper::google_analytics($g, $this->host) : '', + 'piwik_analytics' => ($p = $this->options['piwik_analytics']) ? DauxHelper::piwik_analytics($p, $this->options['piwik_analytics_id']) : '', + + 'docs_path' => $this->docs_path, + 'tree' => $this->tree, + 'index' => ($this->tree->index_page !== false) ? $this->tree->index_page : $this->tree->first_page, + 'template' => $this->options['template'], + ); } - private function save_file($request, $content) { - $file = $this->get_file_from_request($request); - if ($file === false) return $this->generate_error_page('Page Not Found', - 'The Page you requested is yet to be made. Try again later.', ErrorPage::MISSING_PAGE_ERROR_TYPE); - if ($file->write($content)) return new SimplePage('Success', 'Successfully Edited'); - else return $this->generate_error_page('File Not Writable', 'The file you wish to write to is not writable.', - ErrorPage::FATAL_ERROR_TYPE); - } - - private function generate_error_page($title, $content, $type) { - $this->error_page = new ErrorPage($title, $content, $this->get_page_params($type)); - $this->error = true; - return $this->error_page; - } - - private function get_page($request) { - $params = $this->params; - $file = $this->get_file_from_request($request); - if ($file === false) return $this->generate_error_page('Page Not Found', - 'The Page you requested is yet to be made. Try again later.', ErrorPage::MISSING_PAGE_ERROR_TYPE); - $params['request'] = $request; - $params['file_uri'] = $file->value; - if ($request !== 'index') $params['entry_page'] = $file->first_page; - return MarkdownPage::fromFile($file, $params); - } - - private function get_page_params($mode = '') { - $params = array(); - $params['local_base'] = $this->local_base; + //TODO :: move to generator + public function get_page_params($mode = '') { if ($mode === '') $mode = $this->mode; + + $params = $this->get_base_params(); $params['mode'] = $mode; - switch ($mode) { - case ErrorPage::FATAL_ERROR_TYPE: - $params['error_type'] = ErrorPage::FATAL_ERROR_TYPE; - break; - case ErrorPage::NORMAL_ERROR_TYPE: - case ErrorPage::MISSING_PAGE_ERROR_TYPE: - $params['error_type'] = $mode; - $params['index_key'] = 'index'; - $params['docs_path'] = $this->docs_path; - $protocol = '//'; - $params['base_url'] = $protocol . $this->base_url; - $params['base_page'] = $params['base_url']; - $params['host'] = $this->host; - $params['tree'] = $this->tree; - $params['index'] = ($this->tree->index_page !== false) ? $this->tree->index_page : $this->tree->first_page; - $params['clean_urls'] = $this->options['clean_urls']; + $params['index_key'] = 'index.html'; + $params['base_url'] = ''; + $params['base_page'] = $params['base_url']; - $params['tagline'] = $this->options['tagline']; - $params['title'] = $this->options['title']; - $params['author'] = $this->options['author']; - $params['image'] = $this->options['image']; - if ($params['image'] !== '') $params['image'] = str_replace('', $params['base_url'], $params['image']); - $params['repo'] = $this->options['repo']; - $params['links'] = $this->options['links']; - $params['twitter'] = $this->options['twitter']; - $params['google_analytics'] = ($g = $this->options['google_analytics']) ? - DauxHelper::google_analytics($g, $this->host) : ''; - $params['piwik_analytics'] = ($p = $this->options['piwik_analytics']) ? - DauxHelper::piwik_analytics($p, $this->options['piwik_analytics_id']) : ''; - - $params['template'] = $this->options['template']; - $params['theme'] = DauxHelper::configure_theme($this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . - $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'] . '/config.json', $params['base_url'], - $this->local_base, $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/'); - break; - - case Daux::LIVE_MODE: - $params['docs_path'] = $this->docs_path; - $params['index_key'] = 'index'; - $protocol = '//'; - $params['base_url'] = $protocol . $this->base_url; - $params['base_page'] = $params['base_url']; - $params['host'] = $this->host; - $params['tree'] = $this->tree; - $params['index'] = ($this->tree->index_page !== false) ? $this->tree->index_page : $this->tree->first_page; - $params['clean_urls'] = $this->options['clean_urls']; - - $params['tagline'] = $this->options['tagline']; - $params['title'] = $this->options['title']; - $params['author'] = $this->options['author']; - $params['image'] = $this->options['image']; - if ($params['image'] !== '') $params['image'] = str_replace('', $params['base_url'], $params['image']); - $params['repo'] = $this->options['repo']; - $params['links'] = $this->options['links']; - $params['twitter'] = $this->options['twitter']; - $params['google_analytics'] = ($g = $this->options['google_analytics']) ? - DauxHelper::google_analytics($g, $this->host) : ''; - $params['piwik_analytics'] = ($p = $this->options['piwik_analytics']) ? - DauxHelper::piwik_analytics($p, $this->options['piwik_analytics_id']) : ''; - - $params['template'] = $this->options['template']; - $params['theme'] = DauxHelper::configure_theme($this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . - $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'] . '/config.json', $params['base_url'], - $this->local_base, $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/', $mode); - - - if ($params['breadcrumbs'] = $this->options['breadcrumbs']) - $params['breadcrumb_separator'] = $this->options['breadcrumb_separator']; - $params['multilanguage'] = !empty($this->options['languages']); - $params['languages'] = $this->options['languages']; - if (empty($this->options['languages'])) { - $params['entry_page'] = $this->tree->first_page; - } else { - foreach ($this->options['languages'] as $key => $name) { - $params['entry_page'][$key] = $this->tree->value[$key]->first_page; - } - } - - $params['toggle_code'] = $this->options['toggle_code']; - $params['float'] = $this->options['float']; - $params['date_modified'] = $this->options['date_modified']; - $params['file_editor'] = $this->options['file_editor']; - break; - - case Daux::STATIC_MODE: - $params['docs_path'] = $this->docs_path; - $params['index_key'] = 'index.html'; - $params['base_url'] = ''; - $params['base_page'] = $params['base_url']; - $params['tree'] = $this->tree; - $params['index'] = ($this->tree->index_page !== false) ? $this->tree->index_page : $this->tree->first_page; - - $params['tagline'] = $this->options['tagline']; - $params['title'] = $this->options['title']; - $params['author'] = $this->options['author']; - $params['image'] = $this->options['image']; - $params['repo'] = $this->options['repo']; - $params['links'] = $this->options['links']; - $params['twitter'] = $this->options['twitter']; - $params['google_analytics'] = ($g = $this->options['google_analytics']) ? - DauxHelper::google_analytics($g, $this->host) : ''; - $params['piwik_analytics'] = ($p = $this->options['piwik_analytics']) ? - DauxHelper::piwik_analytics($p, $this->options['piwik_analytics_id']) : ''; - - $params['template'] = $this->options['template']; - $params['theme'] = DauxHelper::configure_theme($this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . - $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'] . '/config.json', $params['base_url'], - $this->local_base, $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/', $mode); - - if ($params['breadcrumbs'] = $this->options['breadcrumbs']) - $params['breadcrumb_separator'] = $this->options['breadcrumb_separator']; - $params['multilanguage'] = !empty($this->options['languages']); - $params['languages'] = $this->options['languages']; - if (empty($this->options['languages'])) { - $params['entry_page'] = $this->tree->first_page; - } else { - foreach ($this->options['languages'] as $key => $name) { - $params['entry_page'][$key] = $this->tree->value[$key]->first_page; - } - } - - $params['toggle_code'] = $this->options['toggle_code']; - $params['float'] = $this->options['float']; - $params['date_modified'] = $this->options['date_modified']; - $params['file_editor'] = false; - break; + if ($params['breadcrumbs'] = $this->options['breadcrumbs']) + $params['breadcrumb_separator'] = $this->options['breadcrumb_separator']; + $params['multilanguage'] = !empty($this->options['languages']); + $params['languages'] = $this->options['languages']; + if (empty($this->options['languages'])) { + $params['entry_page'] = $this->tree->first_page; + } else { + foreach ($this->options['languages'] as $key => $name) { + $params['entry_page'][$key] = $this->tree->value[$key]->first_page; + } } + + $params['toggle_code'] = $this->options['toggle_code']; + $params['float'] = $this->options['float']; + $params['date_modified'] = $this->options['date_modified']; + $params['file_editor'] = false; + + $params['theme'] = GeneratorHelper::configure_theme( + $this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'], + $params['base_url'], + $this->local_base, + $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/' + ); + return $params; } - private function get_file_from_request($request) { - $file = $this->tree->retrieve_file($request); - return $file; + //TODO :: move to server + public function get_live_page_params() { + $params = $this->get_base_params(); + + $params['mode'] = Daux::LIVE_MODE; + + $params['index_key'] = 'index'; + $protocol = '//'; + $params['base_url'] = $protocol . $this->base_url; + $params['base_page'] = $params['base_url']; + $params['host'] = $this->host; + $params['clean_urls'] = $this->options['clean_urls']; + + if ($params['image'] !== '') $params['image'] = str_replace('', $params['base_url'], $params['image']); + + if ($params['breadcrumbs'] = $this->options['breadcrumbs']) + $params['breadcrumb_separator'] = $this->options['breadcrumb_separator']; + $params['multilanguage'] = !empty($this->options['languages']); + $params['languages'] = $this->options['languages']; + if (empty($this->options['languages'])) { + $params['entry_page'] = $this->tree->first_page; + } else { + foreach ($this->options['languages'] as $key => $name) { + $params['entry_page'][$key] = $this->tree->value[$key]->first_page; + } + } + + $params['toggle_code'] = $this->options['toggle_code']; + $params['float'] = $this->options['float']; + $params['date_modified'] = $this->options['date_modified']; + $params['file_editor'] = $this->options['file_editor']; + + $params['theme'] = ServerHelper::configure_theme( + $this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'], + $params['base_url'], + $this->local_base, + $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/' + ); + + return $params; } - } - - ?> diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index 3c7bee3..6bf5f4b 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -54,127 +54,34 @@ return $filename; } - public static function build_directory_tree($dir, $ignore, $mode) { - return static::directory_tree_builder($dir, $ignore, $mode); - } + public static function get_theme($theme_folder, $local_base) { + $name = static::pathinfo($theme_folder); - - //Depreciated - public static function get_request_from_url($url, $base_url) { - $url = substr($url, strlen($base_url)); - if (strpos($url, 'index.php') === 0) { - $request = (($i = strpos($url, 'request=')) !== false) ? $request = substr($url, $i + 8) : ''; - if ($end = strpos($request, '&')) $request = substr($request, 0, $end); - $request = ($request === '') ? 'index' : $request; - } else { - $request = ($url == '') ? 'index' : $url; - $request = ($end = strpos($request, '?')) ? substr($request, 0, $end) : $request; - } - return $request; - } - - - - public static function get_request($prefix_slash = false) - { - if (isset($_SERVER['PATH_INFO'])) $uri = $_SERVER['PATH_INFO']; - else if (isset($_SERVER['REQUEST_URI'])) { - $uri = $_SERVER['REQUEST_URI']; - if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); - else if (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); - if (strncmp($uri, '?/', 2) === 0) $uri = substr($uri, 2); - $parts = preg_split('#\?#i', $uri, 2); - $uri = $parts[0]; - if (isset($parts[1])) { - $_SERVER['QUERY_STRING'] = $parts[1]; - parse_str($_SERVER['QUERY_STRING'], $_GET); - } else { - $_SERVER['QUERY_STRING'] = ''; - $_GET = array(); - } - $uri = parse_url($uri, PHP_URL_PATH); - } - else return false; - $uri = str_replace(array('//', '../'), '/', trim($uri, '/')); - if ($uri == "") $uri = "first_page"; - return $uri; - } - - public static function configure_theme($theme, $base_url, $local_base, $theme_url, $mode = Daux::LIVE_MODE) { - $name = static::pathinfo($theme); - if (is_file($theme)) { - $theme = file_get_contents($theme); - $theme = json_decode($theme, true); + $theme = array(); + if (is_file($theme_folder . DIRECTORY_SEPARATOR . "config.json")) { + $theme = json_decode(file_get_contents($theme_folder . DIRECTORY_SEPARATOR . "config.json"), true); if (!$theme) $theme = array(); - } else $theme = array(); + } $theme['name'] = $name['filename']; - if ($mode === Daux::LIVE_MODE) { - if (!isset($theme['favicon'])) $theme['favicon'] = utf8_encode($base_url . 'img/favicon.png'); - else { - $theme['favicon'] = utf8_encode(str_replace('', $base_url, $theme['favicon'])); - $theme['favicon'] = str_replace('', $theme_url, $theme['favicon']); - } + $theme += ['css' => [], 'js' => [], 'fonts' => [], 'require-jquery' => false, 'bootstrap-js' => false]; - if (!isset($theme['css'])) $theme['css'] = array(); - else { - foreach ($theme['css'] as $key => $css) { - $theme['css'][$key] = utf8_encode(str_replace('', $base_url, $css)); - $theme['css'][$key] = utf8_encode(str_replace('', $theme_url, $css)); - } - } - if (!isset($theme['fonts'])) $theme['fonts'] = array(); - else { - foreach ($theme['fonts'] as $key => $font) { - $theme['fonts'][$key] = utf8_encode(str_replace('', $base_url, $font)); - $theme['fonts'][$key] = utf8_encode(str_replace('', $theme_url, $font)); - } - } - if (!isset($theme['js'])) $theme['js'] = array(); - else { - foreach ($theme['js'] as $key => $js) { - $theme['js'][$key] = utf8_encode(str_replace('', $base_url, $js)); - $theme['js'][$key] = utf8_encode(str_replace('', $theme_url, $js)); - } - } + + if (!isset($theme['template'])){ + $theme['template'] = $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/default.tpl'; + } else{ + $theme['template'] = str_replace('', $local_base, $theme['template']); + } + if (!isset($theme['error-template'])) { + $theme['error-template'] = $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/error.tpl'; } else { - if (!isset($theme['favicon'])) $theme['favicon'] = 'img/favicon.png'; - if (!isset($theme['css'])) $theme['css'] = array(); - if (!isset($theme['fonts'])) $theme['fonts'] = array(); - if (!isset($theme['js'])) $theme['js'] = array(); + $theme['error-template'] = str_replace('', $local_base, $theme['error-template']); } - if (!isset($theme['template'])) $theme['template'] = $local_base . DIRECTORY_SEPARATOR . 'templates' . - DIRECTORY_SEPARATOR . 'default/default.tpl'; - else $theme['template'] = str_replace('', $local_base, $theme['template']); - if (!isset($theme['error-template'])) $theme['error-template'] = $local_base . DIRECTORY_SEPARATOR . 'templates' . - DIRECTORY_SEPARATOR . 'default/error.tpl'; - else $theme['error-template'] = str_replace('', $local_base, $theme['error-template']); - if (!isset($theme['require-jquery'])) $theme['require-jquery'] = false; - if (!isset($theme['bootstrap-js'])) $theme['bootstrap-js'] = false; - return $theme; } - public static function rebase_theme($theme, $base_url, $theme_url) { - $theme['favicon'] = utf8_encode(str_replace('', $base_url, $theme['favicon'])); - $theme['favicon'] = str_replace('', $theme_url, $theme['favicon']); - foreach ($theme['css'] as $key => $css) { - $theme['css'][$key] = utf8_encode(str_replace('', $base_url, $css)); - $theme['css'][$key] = utf8_encode(str_replace('', $theme_url, $css)); - } - foreach ($theme['fonts'] as $key => $font) { - $theme['fonts'][$key] = utf8_encode(str_replace('', $base_url, $font)); - $theme['fonts'][$key] = utf8_encode(str_replace('', $theme_url, $font)); - - } - foreach ($theme['js'] as $key => $js) { - $theme['js'][$key] = utf8_encode(str_replace('', $base_url, $js)); - $theme['js'][$key] = utf8_encode(str_replace('', $theme_url, $js)); - } - return $theme; - } public static function google_analytics($analytics, $host) { $ga = <<getFilename() === '.' || $file->getFilename() === '..') continue; - if ($file->isDir()) rmdir($file->getRealPath()); - else unlink($file->getRealPath()); - } - } - - private static function copy_recursive($src,$dst) { - $dir = opendir($src); - @mkdir($dst); - while(false !== ( $file = readdir($dir)) ) { - if (( $file != '.' ) && ( $file != '..' )) { - if ( is_dir($src . '/' . $file) ) { - static::copy_recursive($src . '/' . $file,$dst . '/' . $file); - } - else { - copy($src . '/' . $file,$dst . '/' . $file); - } - } - } - closedir($dir); - } - } diff --git a/libs/Entry.php b/libs/Entry.php index c31d0b7..cffe0b9 100644 --- a/libs/Entry.php +++ b/libs/Entry.php @@ -3,6 +3,7 @@ { const FILE_TYPE = 'FILE_TYPE'; const DIRECTORY_TYPE = 'DIRECTORY_TYPE'; + public $name; public $title; public $type; diff --git a/libs/Exception.php b/libs/Exception.php new file mode 100644 index 0000000..9ccaa45 --- /dev/null +++ b/libs/Exception.php @@ -0,0 +1,5 @@ +initialize($global_config); + + $this->generate_static($daux, $destination); + } + + public function generate_static(Daux $daux, $output_dir = NULL) { + $params = $daux->get_page_params(); + if (is_null($output_dir)) $output_dir = $daux->local_base . DIRECTORY_SEPARATOR . 'static'; + Helper::clean_copy_assets($output_dir, $daux->local_base); + $this->recursive_generate_static($daux->tree, $output_dir, $params); + } + + private function recursive_generate_static($tree, $output_dir, $params, $base_url = '') { + $params['base_url'] = $params['base_page'] = $base_url; + $new_params = $params; + //changed this as well in order for the templates to be put in the right place + $params['theme'] = Helper::rebase_theme($params['theme'], $base_url, $params['base_url'] . "templates/default/themes/" . $params['theme']['name'] . '/'); + // + $params['image'] = str_replace('', $base_url, $params['image']); + if ($base_url !== '') $params['entry_page'] = $tree->first_page; + foreach ($tree->value as $key => $node) { + if ($node->type === Entry::DIRECTORY_TYPE) { + $new_output_dir = $output_dir . DIRECTORY_SEPARATOR . $key; + @mkdir($new_output_dir); + $this->recursive_generate_static($node, $new_output_dir, $new_params, '../' . $base_url); + } else { + $params['request'] = $node->get_url(); + $params['file_uri'] = $node->name; + + $page = MarkdownPage::fromFile($node, $params); + file_put_contents($output_dir . DIRECTORY_SEPARATOR . $key, $page->get_page_content()); + } + } + } + + +} diff --git a/libs/Generator/Helper.php b/libs/Generator/Helper.php new file mode 100644 index 0000000..b54f3e3 --- /dev/null +++ b/libs/Generator/Helper.php @@ -0,0 +1,79 @@ +getFilename() === '.' || $file->getFilename() === '..') continue; + if ($file->isDir()) rmdir($file->getRealPath()); + else unlink($file->getRealPath()); + } + } + + private static function copy_recursive($src,$dst) { + $dir = opendir($src); + @mkdir($dst); + while(false !== ( $file = readdir($dir)) ) { + if (( $file != '.' ) && ( $file != '..' )) { + if ( is_dir($src . '/' . $file) ) { + static::copy_recursive($src . '/' . $file,$dst . '/' . $file); + } + else { + copy($src . '/' . $file,$dst . '/' . $file); + } + } + } + closedir($dir); + } + + public static function rebase_theme($theme, $base_url, $theme_url) { + $theme['favicon'] = utf8_encode(str_replace('', $base_url, $theme['favicon'])); + $theme['favicon'] = str_replace('', $theme_url, $theme['favicon']); + + foreach ($theme['css'] as $key => $css) { + $theme['css'][$key] = utf8_encode(str_replace('', $base_url, $css)); + $theme['css'][$key] = utf8_encode(str_replace('', $theme_url, $css)); + } + foreach ($theme['fonts'] as $key => $font) { + $theme['fonts'][$key] = utf8_encode(str_replace('', $base_url, $font)); + $theme['fonts'][$key] = utf8_encode(str_replace('', $theme_url, $font)); + + } + foreach ($theme['js'] as $key => $js) { + $theme['js'][$key] = utf8_encode(str_replace('', $base_url, $js)); + $theme['js'][$key] = utf8_encode(str_replace('', $theme_url, $js)); + } + return $theme; + } + + public static function configure_theme($theme, $base_url, $local_base, $theme_url) { + $theme = DauxHelper::get_theme($theme, $local_base); + + if (!isset($theme['favicon'])) $theme['favicon'] = 'img/favicon.png'; + + return $theme; + } +} diff --git a/libs/ErrorPage.php b/libs/Server/ErrorPage.php similarity index 95% rename from libs/ErrorPage.php rename to libs/Server/ErrorPage.php index 4a15388..e112c73 100644 --- a/libs/ErrorPage.php +++ b/libs/Server/ErrorPage.php @@ -1,4 +1,6 @@ -', $base_url, $theme['favicon'])); + $theme['favicon'] = str_replace('', $theme_url, $theme['favicon']); + } + + foreach ($theme['css'] as $key => $css) { + $theme['css'][$key] = utf8_encode(str_replace('', $base_url, $css)); + $theme['css'][$key] = utf8_encode(str_replace('', $theme_url, $css)); + } + + foreach ($theme['fonts'] as $key => $font) { + $theme['fonts'][$key] = utf8_encode(str_replace('', $base_url, $font)); + $theme['fonts'][$key] = utf8_encode(str_replace('', $theme_url, $font)); + } + + foreach ($theme['js'] as $key => $js) { + $theme['js'][$key] = utf8_encode(str_replace('', $base_url, $js)); + $theme['js'][$key] = utf8_encode(str_replace('', $theme_url, $js)); + } + + return $theme; + } + + public static function get_error_params(Daux $daux) + { + $params = $daux->get_base_params(); + $params['theme'] = Helper::configure_theme( + $daux->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $daux->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $daux->options['theme'], + $params['base_url'], + $daux->local_base, + $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $daux->options['theme'] . '/' + ); + + $params['index_key'] = 'index'; + + $protocol = '//'; + $params['base_url'] = $protocol . $daux->base_url; + $params['base_page'] = $params['base_url']; + $params['host'] = $daux->host; + + $params['clean_urls'] = $daux->options['clean_urls']; + + if ($params['image'] !== '') $params['image'] = str_replace('', $params['base_url'], $params['image']); + + return $params; + } + + public static function get_request() + { + if (isset($_SERVER['PATH_INFO'])) $uri = $_SERVER['PATH_INFO']; + else if (isset($_SERVER['REQUEST_URI'])) { + $uri = $_SERVER['REQUEST_URI']; + if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); + else if (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); + if (strncmp($uri, '?/', 2) === 0) $uri = substr($uri, 2); + $parts = preg_split('#\?#i', $uri, 2); + $uri = $parts[0]; + if (isset($parts[1])) { + $_SERVER['QUERY_STRING'] = $parts[1]; + parse_str($_SERVER['QUERY_STRING'], $_GET); + } else { + $_SERVER['QUERY_STRING'] = ''; + $_GET = array(); + } + $uri = parse_url($uri, PHP_URL_PATH); + } + else return false; + $uri = str_replace(array('//', '../'), '/', trim($uri, '/')); + if ($uri == "") $uri = "first_page"; + return $uri; + } +} diff --git a/libs/Server/NotFoundException.php b/libs/Server/NotFoundException.php new file mode 100644 index 0000000..f8f9a1c --- /dev/null +++ b/libs/Server/NotFoundException.php @@ -0,0 +1,7 @@ +initialize(); + $server = new static($daux); + + $page = $server->handle($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], $_REQUEST); + } + catch( NotFoundException $e ) + { + $page = new ErrorPage("An error occured", $e->getMessage(), Helper::get_error_params($daux)); + } + + $page->display(); + } + + public function __construct(Daux $daux) { + $this->daux = $daux; + } + + public function handle($url, $query = []) { + + $this->params = $this->daux->get_live_page_params(); + + if (!$this->params['clean_urls']) $this->params['base_page'] .= 'index.php/'; + $request = Helper::get_request(); + $request = urldecode($request); + $request_type = isset($query['method']) ? $query['method'] : ''; + if($request == 'first_page') { + $request = $this->daux->tree->first_page->uri; + } + switch ($request_type) { + case 'DauxEdit': + if (!$this->daux->options['file_editor']) { + throw new Exception('Editing is currently disabled in config'); + } + + $content = isset($query['markdown']) ? $query['markdown'] : ''; + return $this->save_file($request, $content); + + default: + return $this->get_page($request); + } + } + + private function save_file($request, $content) { + $file = $this->get_file_from_request($request); + + if ($file === false) throw new NotFoundException('The Page you requested is yet to be made. Try again later.'); + + if (!$file->write($content)) throw new Exception('The file you wish to write to is not writable.'); + + return new SimplePage('Success', 'Successfully Edited'); + } + + private function get_file_from_request($request) { + $file = $this->daux->tree->retrieve_file($request); + return $file; + } + + private function get_page($request) { + $params = $this->params; + + $file = $this->get_file_from_request($request); + if ($file === false) throw new NotFoundException('The Page you requested is yet to be made. Try again later.'); + $params['request'] = $request; + $params['file_uri'] = $file->value; + if ($request !== 'index') $params['entry_page'] = $file->first_page; + return MarkdownPage::fromFile($file, $params); + } +} From 2c228273fba3f608583cc937651fadf83cb2c101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Wed, 22 Apr 2015 14:05:37 +0200 Subject: [PATCH 004/127] Simplify `configure_theme` and `get_theme` --- libs/Daux.php | 4 ++-- libs/DauxHelper.php | 39 +++++++++++++++++++++++++----------- libs/Generator/Generator.php | 4 ---- libs/Generator/Helper.php | 28 -------------------------- libs/Server/Helper.php | 31 +--------------------------- 5 files changed, 30 insertions(+), 76 deletions(-) diff --git a/libs/Daux.php b/libs/Daux.php index 176ab18..ff8abe0 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -138,7 +138,7 @@ $params['date_modified'] = $this->options['date_modified']; $params['file_editor'] = false; - $params['theme'] = GeneratorHelper::configure_theme( + $params['theme'] = DauxHelper::get_theme( $this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'], $params['base_url'], $this->local_base, @@ -180,7 +180,7 @@ $params['date_modified'] = $this->options['date_modified']; $params['file_editor'] = $this->options['file_editor']; - $params['theme'] = ServerHelper::configure_theme( + $params['theme'] = DauxHelper::get_theme( $this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'], $params['base_url'], $this->local_base, diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index 6bf5f4b..1fb429f 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -54,7 +54,7 @@ return $filename; } - public static function get_theme($theme_folder, $local_base) { + public static function get_theme($theme_folder, $base_url, $local_base, $theme_url) { $name = static::pathinfo($theme_folder); $theme = array(); @@ -64,25 +64,40 @@ } $theme['name'] = $name['filename']; - $theme += ['css' => [], 'js' => [], 'fonts' => [], 'require-jquery' => false, 'bootstrap-js' => false]; + //Default parameters for theme + $theme += [ + 'css' => [], + 'js' => [], + 'fonts' => [], + 'require-jquery' => false, + 'bootstrap-js' => false, + 'favicon' => 'img/favicon.png', + 'template' => $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/default.tpl', + 'error-template' => $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/error.tpl', + ]; + $substitutions = ['' => $local_base, '' => $base_url, '' => $theme_url]; - if (!isset($theme['template'])){ - $theme['template'] = $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/default.tpl'; - } else{ - $theme['template'] = str_replace('', $local_base, $theme['template']); + // Substitute some placeholders + $theme['template'] = strtr($theme['template'], $substitutions); + $theme['error-template'] = strtr($theme['error-template'], $substitutions); + $theme['favicon'] = utf8_encode(strtr($theme['favicon'], $substitutions)); + + foreach ($theme['css'] as $key => $css) { + $theme['css'][$key] = utf8_encode(strtr($css, $substitutions)); } - if (!isset($theme['error-template'])) { - $theme['error-template'] = $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/error.tpl'; - } else { - $theme['error-template'] = str_replace('', $local_base, $theme['error-template']); + + foreach ($theme['fonts'] as $key => $font) { + $theme['fonts'][$key] = utf8_encode(strtr($font, $substitutions)); + } + + foreach ($theme['js'] as $key => $js) { + $theme['js'][$key] = utf8_encode(strtr($js, $substitutions)); } return $theme; } - - public static function google_analytics($analytics, $host) { $ga = << diff --git a/libs/Generator/Generator.php b/libs/Generator/Generator.php index 6a75200..7bd33d2 100644 --- a/libs/Generator/Generator.php +++ b/libs/Generator/Generator.php @@ -22,8 +22,6 @@ class Generator { private function recursive_generate_static($tree, $output_dir, $params, $base_url = '') { $params['base_url'] = $params['base_page'] = $base_url; $new_params = $params; - //changed this as well in order for the templates to be put in the right place - $params['theme'] = Helper::rebase_theme($params['theme'], $base_url, $params['base_url'] . "templates/default/themes/" . $params['theme']['name'] . '/'); // $params['image'] = str_replace('', $base_url, $params['image']); if ($base_url !== '') $params['entry_page'] = $tree->first_page; @@ -41,6 +39,4 @@ class Generator { } } } - - } diff --git a/libs/Generator/Helper.php b/libs/Generator/Helper.php index b54f3e3..c985550 100644 --- a/libs/Generator/Helper.php +++ b/libs/Generator/Helper.php @@ -48,32 +48,4 @@ class Helper { } closedir($dir); } - - public static function rebase_theme($theme, $base_url, $theme_url) { - $theme['favicon'] = utf8_encode(str_replace('', $base_url, $theme['favicon'])); - $theme['favicon'] = str_replace('', $theme_url, $theme['favicon']); - - foreach ($theme['css'] as $key => $css) { - $theme['css'][$key] = utf8_encode(str_replace('', $base_url, $css)); - $theme['css'][$key] = utf8_encode(str_replace('', $theme_url, $css)); - } - foreach ($theme['fonts'] as $key => $font) { - $theme['fonts'][$key] = utf8_encode(str_replace('', $base_url, $font)); - $theme['fonts'][$key] = utf8_encode(str_replace('', $theme_url, $font)); - - } - foreach ($theme['js'] as $key => $js) { - $theme['js'][$key] = utf8_encode(str_replace('', $base_url, $js)); - $theme['js'][$key] = utf8_encode(str_replace('', $theme_url, $js)); - } - return $theme; - } - - public static function configure_theme($theme, $base_url, $local_base, $theme_url) { - $theme = DauxHelper::get_theme($theme, $local_base); - - if (!isset($theme['favicon'])) $theme['favicon'] = 'img/favicon.png'; - - return $theme; - } } diff --git a/libs/Server/Helper.php b/libs/Server/Helper.php index bd340df..25b6d73 100644 --- a/libs/Server/Helper.php +++ b/libs/Server/Helper.php @@ -4,39 +4,10 @@ use Todaymade\Daux\Daux; use Todaymade\Daux\DauxHelper; class Helper { - public static function configure_theme($theme_file, $base_url, $local_base, $theme_url) { - - $theme = DauxHelper::get_theme($theme_file, $local_base); - - if (!isset($theme['favicon'])){ - $theme['favicon'] = utf8_encode($base_url . 'img/favicon.png'); - } else { - $theme['favicon'] = utf8_encode(str_replace('', $base_url, $theme['favicon'])); - $theme['favicon'] = str_replace('', $theme_url, $theme['favicon']); - } - - foreach ($theme['css'] as $key => $css) { - $theme['css'][$key] = utf8_encode(str_replace('', $base_url, $css)); - $theme['css'][$key] = utf8_encode(str_replace('', $theme_url, $css)); - } - - foreach ($theme['fonts'] as $key => $font) { - $theme['fonts'][$key] = utf8_encode(str_replace('', $base_url, $font)); - $theme['fonts'][$key] = utf8_encode(str_replace('', $theme_url, $font)); - } - - foreach ($theme['js'] as $key => $js) { - $theme['js'][$key] = utf8_encode(str_replace('', $base_url, $js)); - $theme['js'][$key] = utf8_encode(str_replace('', $theme_url, $js)); - } - - return $theme; - } - public static function get_error_params(Daux $daux) { $params = $daux->get_base_params(); - $params['theme'] = Helper::configure_theme( + $params['theme'] = DauxHelper::get_theme( $daux->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $daux->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $daux->options['theme'], $params['base_url'], $daux->local_base, From ecd5efe758dba823411641b89656c5207c561408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Wed, 22 Apr 2015 18:24:10 +0200 Subject: [PATCH 005/127] Extract tree builder Add related files directly in the documentation --- README.md | 2 +- docs/00_Getting_Started.md | 2 +- docs/_index.md | 4 +- {img => docs}/app-thumbs.png | Bin {img => docs}/app.png | Bin docs/config.json | 6 +- libs/Daux.php | 83 ++++++++----------- libs/DauxHelper.php | 66 +-------------- libs/Entry.php | 127 ----------------------------- libs/Generator/Generator.php | 8 +- libs/Generator/Helper.php | 4 +- libs/MarkdownPage.php | 21 +++-- libs/Server/ErrorPage.php | 12 +-- libs/Server/Helper.php | 24 ------ libs/Server/Server.php | 43 ++++++++-- libs/Tree/Builder.php | 62 ++++++++++++++ libs/Tree/Content.php | 19 +++++ libs/Tree/Directory.php | 43 ++++++++++ libs/Tree/Entry.php | 86 +++++++++++++++++++ libs/Tree/Raw.php | 9 ++ {img => resources/img}/favicon.png | Bin templates/default/default.tpl | 5 +- templates/default/error.tpl | 5 +- 23 files changed, 327 insertions(+), 304 deletions(-) rename {img => docs}/app-thumbs.png (100%) rename {img => docs}/app.png (100%) delete mode 100644 libs/Entry.php create mode 100644 libs/Tree/Builder.php create mode 100644 libs/Tree/Content.php create mode 100644 libs/Tree/Directory.php create mode 100644 libs/Tree/Entry.php create mode 100644 libs/Tree/Raw.php rename {img => resources/img}/favicon.png (100%) diff --git a/README.md b/README.md index 94b69c0..f29e248 100755 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ If you want to create a beautiful landing page for your project, simply create a { "title": "Daux.io", "tagline": "The Easiest Way To Document Your Project", - "image": "img/app.png" + "image": "app.png" } ``` diff --git a/docs/00_Getting_Started.md b/docs/00_Getting_Started.md index 629e91a..fef7fad 100644 --- a/docs/00_Getting_Started.md +++ b/docs/00_Getting_Started.md @@ -75,7 +75,7 @@ If you want to create a beautiful landing page for your project, simply create a { "title": "Daux.io", "tagline": "The Easiest Way To Document Your Project", - "image": "img/app.png" + "image": "app.png" } ``` diff --git a/docs/_index.md b/docs/_index.md index 0993c2b..bb12a60 100644 --- a/docs/_index.md +++ b/docs/_index.md @@ -6,7 +6,7 @@

    Features


    -alt text +alt text * 100% Mobile Responsive * Supports GitHub Flavored Markdown @@ -38,4 +38,4 @@ var google_remarketing_only = true;
    - \ No newline at end of file + diff --git a/img/app-thumbs.png b/docs/app-thumbs.png similarity index 100% rename from img/app-thumbs.png rename to docs/app-thumbs.png diff --git a/img/app.png b/docs/app.png similarity index 100% rename from img/app.png rename to docs/app.png diff --git a/docs/config.json b/docs/config.json index 47bbdbf..e84ad5b 100644 --- a/docs/config.json +++ b/docs/config.json @@ -1,8 +1,8 @@ { "title": "DAUX.IO", "tagline": "The Easiest Way To Document Your Project", - "author": "Justin Walsh", - "image": "img/app.png", + "author": "Justin Walsh", + "image": "app.png", "theme": "daux-blue", "template": "default", "clean_urls": true, @@ -11,7 +11,7 @@ "breadcrumb_separator": "Chevrons", "date_modified": true, "float": true, - "file_editor": false, + "file_editor": false, "repo": "justinwalsh/daux.io", "ignore": { "files": ["Work_In_Progress.md"], diff --git a/libs/Daux.php b/libs/Daux.php index ff8abe0..5e270e4 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -2,6 +2,7 @@ use Todaymade\Daux\Server\Helper as ServerHelper; use Todaymade\Daux\Generator\Helper as GeneratorHelper; + use Todaymade\Daux\Tree\Builder; class Daux { @@ -80,7 +81,7 @@ } private function generate_directory_tree() { - $this->tree = DauxHelper::build_directory_tree($this->docs_path, $this->options['ignore'], $this->mode); + $this->tree = Builder::build($this->docs_path, $this->options['ignore'], $this->mode); if (!empty($this->options['languages'])) { foreach ($this->options['languages'] as $key => $node) { $this->tree->value[$key]->title = $node; @@ -89,9 +90,8 @@ } public function get_base_params() { - return array( - 'local_base' => $this->local_base, - + $params = array( + //Informations 'tagline' => $this->options['tagline'], 'title' => $this->options['title'], 'author' => $this->options['author'], @@ -99,44 +99,46 @@ 'repo' => $this->options['repo'], 'links' => $this->options['links'], 'twitter' => $this->options['twitter'], + + //Features 'google_analytics' => ($g = $this->options['google_analytics']) ? DauxHelper::google_analytics($g, $this->host) : '', 'piwik_analytics' => ($p = $this->options['piwik_analytics']) ? DauxHelper::piwik_analytics($p, $this->options['piwik_analytics_id']) : '', + 'toggle_code' => $this->options['toggle_code'], + 'float' => $this->options['float'], + 'date_modified' => $this->options['date_modified'], + 'file_editor' => false, + 'breadcrumbs' => $this->options['breadcrumbs'], + 'breadcrumb_separator' => $this->options['breadcrumb_separator'], + 'multilanguage' => !empty($this->options['languages']), + 'languages' => $this->options['languages'], + + //Paths and tree + 'mode' => $this->mode, + 'local_base' => $this->local_base, 'docs_path' => $this->docs_path, 'tree' => $this->tree, 'index' => ($this->tree->index_page !== false) ? $this->tree->index_page : $this->tree->first_page, 'template' => $this->options['template'], ); - } - //TODO :: move to generator - public function get_page_params($mode = '') { - - if ($mode === '') $mode = $this->mode; - - $params = $this->get_base_params(); - $params['mode'] = $mode; - - $params['index_key'] = 'index.html'; - $params['base_url'] = ''; - $params['base_page'] = $params['base_url']; - - if ($params['breadcrumbs'] = $this->options['breadcrumbs']) - $params['breadcrumb_separator'] = $this->options['breadcrumb_separator']; - $params['multilanguage'] = !empty($this->options['languages']); - $params['languages'] = $this->options['languages']; - if (empty($this->options['languages'])) { - $params['entry_page'] = $this->tree->first_page; - } else { + if (!$params['multilanguage']) { foreach ($this->options['languages'] as $key => $name) { $params['entry_page'][$key] = $this->tree->value[$key]->first_page; } + } else { + $params['entry_page'] = $this->tree->first_page; } - $params['toggle_code'] = $this->options['toggle_code']; - $params['float'] = $this->options['float']; - $params['date_modified'] = $this->options['date_modified']; - $params['file_editor'] = false; + return $params; + } + + //TODO :: move to generator + public function get_page_params() { + $params = $this->get_base_params(); + + $params['index_key'] = 'index.html'; + $params['base_page'] = $params['base_url'] = ''; $params['theme'] = DauxHelper::get_theme( $this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'], @@ -152,34 +154,13 @@ public function get_live_page_params() { $params = $this->get_base_params(); - $params['mode'] = Daux::LIVE_MODE; - $params['index_key'] = 'index'; - $protocol = '//'; - $params['base_url'] = $protocol . $this->base_url; - $params['base_page'] = $params['base_url']; $params['host'] = $this->host; - $params['clean_urls'] = $this->options['clean_urls']; + $params['base_page'] = $params['base_url'] = '//' . $this->base_url; + if (!$this->options['clean_urls']) $params['base_page'] .= 'index.php/'; if ($params['image'] !== '') $params['image'] = str_replace('', $params['base_url'], $params['image']); - if ($params['breadcrumbs'] = $this->options['breadcrumbs']) - $params['breadcrumb_separator'] = $this->options['breadcrumb_separator']; - $params['multilanguage'] = !empty($this->options['languages']); - $params['languages'] = $this->options['languages']; - if (empty($this->options['languages'])) { - $params['entry_page'] = $this->tree->first_page; - } else { - foreach ($this->options['languages'] as $key => $name) { - $params['entry_page'][$key] = $this->tree->value[$key]->first_page; - } - } - - $params['toggle_code'] = $this->options['toggle_code']; - $params['float'] = $this->options['float']; - $params['date_modified'] = $this->options['date_modified']; - $params['file_editor'] = $this->options['file_editor']; - $params['theme'] = DauxHelper::get_theme( $this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'], $params['base_url'], diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index 1fb429f..82753c4 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -22,38 +22,6 @@ return $request; } - public static function get_title_from_file($file) { - $file = static::pathinfo($file); - return static::get_title_from_filename($file['filename']); - } - - public static function get_title_from_filename($filename) { - $filename = explode('_', $filename); - if ($filename[0] == '' || is_numeric($filename[0])) unset($filename[0]); - else { - $t = $filename[0]; - if ($t[0] == '-') $filename[0] = substr($t, 1); - } - $filename = implode(' ', $filename); - return $filename; - } - - public static function get_url_from_file($file) { - $file = static::pathinfo($file); - return static::get_url_from_filename($file['filename']); - } - - public static function get_url_from_filename($filename) { - $filename = explode('_', $filename); - if ($filename[0] == '' || is_numeric($filename[0])) unset($filename[0]); - else { - $t = $filename[0]; - if ($t[0] == '-') $filename[0] = substr($t, 1); - } - $filename = implode('_', $filename); - return $filename; - } - public static function get_theme($theme_folder, $base_url, $local_base, $theme_url) { $name = static::pathinfo($theme_folder); @@ -71,7 +39,7 @@ 'fonts' => [], 'require-jquery' => false, 'bootstrap-js' => false, - 'favicon' => 'img/favicon.png', + 'favicon' => 'resources/img/favicon.png', 'template' => $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/default.tpl', 'error-template' => $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/error.tpl', ]; @@ -132,38 +100,6 @@ EOT; return $pa; } - public static function build_directory_tree($dir, $ignore, $mode = Daux::LIVE_MODE, $parents = null) { - if ($dh = opendir($dir)) { - $node = new Entry($dir, $parents); - $new_parents = $parents; - if (is_null($new_parents)) $new_parents = array(); - else $new_parents[] = $node; - while (($entry = readdir($dh)) !== false) { - if ($entry == '.' || $entry == '..') continue; - $path = $dir . DIRECTORY_SEPARATOR . $entry; - if (is_dir($path) && in_array($entry, $ignore['folders'])) continue; - if (!is_dir($path) && in_array($entry, $ignore['files'])) continue; - - $file_details = static::pathinfo($path); - if (is_dir($path)) $entry = static::build_directory_tree($path, $ignore, $mode, $new_parents); - else if (in_array($file_details['extension'], Daux::$VALID_MARKDOWN_EXTENSIONS)) - { - $entry = new Entry($path, $new_parents); - if ($mode === Daux::STATIC_MODE) $entry->uri .= '.html'; - } - if ($entry instanceof Entry) $node->value[$entry->uri] = $entry; - } - $node->sort(); - $node->first_page = $node->get_first_page(); - $index_key = ($mode === Daux::LIVE_MODE) ? 'index' : 'index.html'; - if (isset($node->value[$index_key])) { - $node->value[$index_key]->first_page = $node->first_page; - $node->index_page = $node->value[$index_key]; - } else $node->index_page = false; - return $node; - } - } - public static function pathinfo($path) { preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $m); if (isset($m[1])) $ret['dir']=$m[1]; diff --git a/libs/Entry.php b/libs/Entry.php deleted file mode 100644 index cffe0b9..0000000 --- a/libs/Entry.php +++ /dev/null @@ -1,127 +0,0 @@ -local_path = $path; - $this->parents = $parents; - $this->last_modified = filemtime($path); - $this->name = DauxHelper::pathinfo($path); - $this->name = $this->name['filename']; - $this->title = DauxHelper::get_title_from_file($this->name); - $this->uri = DauxHelper::get_url_from_filename($this->name); - $this->index_page = false; - if (is_dir($path)) { - $this->type = Entry::DIRECTORY_TYPE; - $this->value = array(); - } else { - $this->type = Entry::FILE_TYPE; - $this->value = $this->uri; - } - } - - public function sort() { - if ($this->type == static::DIRECTORY_TYPE) uasort($this->value, array($this, 'compare_directory_entries')); - } - - public function retrieve_file($request, $get_first_file = false) { - $tree = $this; - $request = explode('/', $request); - foreach ($request as $node) { - if ($tree->type === static::DIRECTORY_TYPE) { - if (isset($tree->value[$node])) $tree = $tree->value[$node]; - else { - if ($node === 'index' || $node === 'index.html') { - if ($get_first_file) { - return ($tree->index_page) ? $tree->index_page : $tree->first_page; - } else { - return $tree->index_page; - } - } else return false; - } - } else return false; - } - if ($tree->type === static::DIRECTORY_TYPE) { - if ($tree->index_page) return $tree->index_page; - else return ($get_first_file) ? $tree->first_page : false; - } else { - return $tree; - } - } - - public function get_url() { - $url = ''; - foreach ($this->parents as $node) { - $url .= $node->uri . '/'; - } - $url .= $this->uri; - return $url; - } - - public function get_first_page() { - foreach ($this->value as $node) { - if ($node->type === static::FILE_TYPE && $node->title != 'index') - return $node; - } - foreach ($this->value as $node) { - if ($node->type === static::DIRECTORY_TYPE) { - $page = $node->get_first_page(); - if ($page) return $page; - } - } - return false; - } - - public function write($content) { - if (is_writable($this->local_path)) file_put_contents($this->local_path, $content); - else return false; - return true; - } - - private function compare_directory_entries($a, $b) { - $name_a = explode('_', $a->name); - $name_b = explode('_', $b->name); - if (is_numeric($name_a[0])) { - $a = intval($name_a[0]); - if (is_numeric($name_b[0])) { - $b = intval($name_b[0]); - if (($a >= 0) == ($b >= 0)) { - $a = abs($a); - $b = abs($b); - if ($a == $b) return (strcasecmp($name_a[1], $name_b[1])); - return ($a > $b) ? 1 : -1; - } - return ($a >= 0) ? -1 : 1; - } - $t = $name_b[0]; - if ($t && $t[0] === '-') return -1; - return ($a < 0) ? 1 : -1; - } else { - if (is_numeric($name_b[0])) { - $b = intval($name_b[0]); - if ($b >= 0) return 1; - $t = $name_a[0]; - if ($t && $t[0] === '-') return 1; - return ($b >= 0) ? 1 : -1; - } - $p = $name_a[0]; - $q = $name_b[0]; - if (($p && $p[0] === '-') == ($q && $q[0] === '-')) return strcasecmp($p, $q); - else return ($p[0] === '-') ? 1 : -1; - } - } - } diff --git a/libs/Generator/Generator.php b/libs/Generator/Generator.php index 7bd33d2..977340f 100644 --- a/libs/Generator/Generator.php +++ b/libs/Generator/Generator.php @@ -3,6 +3,8 @@ use Todaymade\Daux\Daux; use Todaymade\Daux\Entry; use Todaymade\Daux\MarkdownPage; +use Todaymade\Daux\Tree\Directory; +use Todaymade\Daux\Tree\Content; class Generator { public function generate($global_config, $destination) { @@ -26,16 +28,18 @@ class Generator { $params['image'] = str_replace('', $base_url, $params['image']); if ($base_url !== '') $params['entry_page'] = $tree->first_page; foreach ($tree->value as $key => $node) { - if ($node->type === Entry::DIRECTORY_TYPE) { + if ($node instanceof Directory) { $new_output_dir = $output_dir . DIRECTORY_SEPARATOR . $key; @mkdir($new_output_dir); $this->recursive_generate_static($node, $new_output_dir, $new_params, '../' . $base_url); - } else { + } else if ($node instanceof Content) { $params['request'] = $node->get_url(); $params['file_uri'] = $node->name; $page = MarkdownPage::fromFile($node, $params); file_put_contents($output_dir . DIRECTORY_SEPARATOR . $key, $page->get_page_content()); + } else { + copy($node->local_path, $output_dir . DIRECTORY_SEPARATOR . $key); } } } diff --git a/libs/Generator/Helper.php b/libs/Generator/Helper.php index c985550..ef1ae33 100644 --- a/libs/Generator/Helper.php +++ b/libs/Generator/Helper.php @@ -8,8 +8,8 @@ class Helper { @mkdir($path); static::clean_directory($path); - @mkdir($path . DIRECTORY_SEPARATOR . 'img'); - static::copy_recursive($local_base . DIRECTORY_SEPARATOR . 'img', $path . DIRECTORY_SEPARATOR . 'img'); + @mkdir($path . DIRECTORY_SEPARATOR . 'resources'); + static::copy_recursive($local_base . DIRECTORY_SEPARATOR . 'resources', $path . DIRECTORY_SEPARATOR . 'resources'); @mkdir($path . DIRECTORY_SEPARATOR . 'js'); static::copy_recursive($local_base . DIRECTORY_SEPARATOR . 'js', $path . DIRECTORY_SEPARATOR . 'js'); //added and changed these in order to fetch the theme files and put them in the right place diff --git a/libs/MarkdownPage.php b/libs/MarkdownPage.php index bf3395d..a1fe68e 100644 --- a/libs/MarkdownPage.php +++ b/libs/MarkdownPage.php @@ -75,15 +75,18 @@ class MarkdownPage extends SimplePage private function generate_page() { $params = $this->params; $Parsedown = new \Parsedown(); - if ($params['request'] === $params['index_key']) { - if ($params['multilanguage']) { - foreach ($params['languages'] as $key => $name) { - $entry_page[utf8_encode($name)] = utf8_encode($params['base_page'] . $params['entry_page'][$key]->get_url()); - } - } else $entry_page['View Documentation'] = utf8_encode($params['base_page'] . $params['entry_page']->uri); - } else if ($params['file_uri'] === 'index') - $entry_page[utf8_encode($params['entry_page']->title)] = utf8_encode($params['base_page']. - $params['entry_page']->get_url()); + $entry_page = []; + //TODO :: debug entry pages + //if ($params['request'] === $params['index_key']) { + // if ($params['multilanguage']) { + // foreach ($params['languages'] as $key => $name) { + // $entry_page[utf8_encode($name)] = utf8_encode($params['base_page'] . $params['entry_page'][$key]->get_url()); + // } + // } else $entry_page['View Documentation'] = utf8_encode($params['base_page'] . $params['entry_page']->uri); + //} else if ($params['file_uri'] === 'index') { + // $entry_page[utf8_encode($params['entry_page']->title)] = utf8_encode($params['base_page'] . $params['entry_page']->get_url()); + //} + $page['entry_page'] = (isset($entry_page)) ? $entry_page : null; $page['homepage'] = $this->homepage; diff --git a/libs/Server/ErrorPage.php b/libs/Server/ErrorPage.php index e112c73..3918f81 100644 --- a/libs/Server/ErrorPage.php +++ b/libs/Server/ErrorPage.php @@ -1,6 +1,7 @@ params = $params; - $this->type = $params['error_type']; } public function display() { - http_response_code($this->type === static::MISSING_PAGE_ERROR_TYPE ? 404 : 500); + http_response_code(404); parent::display(); } public function get_page_content() { - if ($this->type !== static::FATAL_ERROR_TYPE && is_null(static::$template)) { - include_once($this->params['theme']['error-template']); - static::$template = new Template(); - } + include_once($this->params['theme']['error-template']); + static::$template = new Template(); if (is_null($this->html)) { $this->html = $this->generate_page(); @@ -37,7 +34,6 @@ class ErrorPage extends SimplePage } public function generate_page() { - if ($this->type === static::FATAL_ERROR_TYPE) return $this->content; $params = $this->params; $page['title'] = $this->title; $page['theme'] = $params['theme']; diff --git a/libs/Server/Helper.php b/libs/Server/Helper.php index 25b6d73..029ec6f 100644 --- a/libs/Server/Helper.php +++ b/libs/Server/Helper.php @@ -4,30 +4,6 @@ use Todaymade\Daux\Daux; use Todaymade\Daux\DauxHelper; class Helper { - public static function get_error_params(Daux $daux) - { - $params = $daux->get_base_params(); - $params['theme'] = DauxHelper::get_theme( - $daux->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $daux->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $daux->options['theme'], - $params['base_url'], - $daux->local_base, - $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $daux->options['theme'] . '/' - ); - - $params['index_key'] = 'index'; - - $protocol = '//'; - $params['base_url'] = $protocol . $daux->base_url; - $params['base_page'] = $params['base_url']; - $params['host'] = $daux->host; - - $params['clean_urls'] = $daux->options['clean_urls']; - - if ($params['image'] !== '') $params['image'] = str_replace('', $params['base_url'], $params['image']); - - return $params; - } - public static function get_request() { if (isset($_SERVER['PATH_INFO'])) $uri = $_SERVER['PATH_INFO']; diff --git a/libs/Server/Server.php b/libs/Server/Server.php index 1445350..aa25ed1 100644 --- a/libs/Server/Server.php +++ b/libs/Server/Server.php @@ -22,7 +22,7 @@ class Server { } catch( NotFoundException $e ) { - $page = new ErrorPage("An error occured", $e->getMessage(), Helper::get_error_params($daux)); + $page = new ErrorPage("An error occured", $e->getMessage(), $daux->get_live_page_params()); } $page->display(); @@ -33,10 +33,8 @@ class Server { } public function handle($url, $query = []) { - $this->params = $this->daux->get_live_page_params(); - if (!$this->params['clean_urls']) $this->params['base_page'] .= 'index.php/'; $request = Helper::get_request(); $request = urldecode($request); $request_type = isset($query['method']) ? $query['method'] : ''; @@ -68,8 +66,43 @@ class Server { } private function get_file_from_request($request) { - $file = $this->daux->tree->retrieve_file($request); - return $file; + $tree = $this->daux->tree; + $request = explode('/', $request); + foreach ($request as $node) { + // If the element we're in currently is not a + // directory, we failed to find the requested file + if (!$tree instanceof Directory) { + return false; + } + + // if the node exists in the current request tree, + // change the $tree variable to reference the new + // node and proceed to the next url part + if (isset($tree->value[$node])) { + $tree = $tree->value[$node]; + continue; + } + + // At this stage, we're in a directory, but no + // sub-item matches, so the current node must + // be an index page or we failed + if ($node !== 'index' && $node !== 'index.html') { + return false; + } + + return $tree->index_page; + } + + // If the entry we found is not a directory, we're done + if (!$tree instanceof Directory) { + return $tree; + } + + if ($tree->index_page){ + return $tree->index_page; + } + + return ($get_first_file) ? $tree->first_page : false; } private function get_page($request) { diff --git a/libs/Tree/Builder.php b/libs/Tree/Builder.php new file mode 100644 index 0000000..88d69db --- /dev/null +++ b/libs/Tree/Builder.php @@ -0,0 +1,62 @@ +uri .= '.html'; + } + } else { + $entry = new Raw($path, $new_parents); + } + + if ($entry instanceof Entry) { + $node->value[$entry->uri] = $entry; + } + } + + $node->sort(); + $node->first_page = $node->get_first_page(); + $index_key = ($mode === Daux::LIVE_MODE) ? 'index' : 'index.html'; + if (isset($node->value[$index_key])) { + $node->value[$index_key]->first_page = $node->first_page; + $node->index_page = $node->value[$index_key]; + } else $node->index_page = false; + return $node; + + } +} diff --git a/libs/Tree/Content.php b/libs/Tree/Content.php new file mode 100644 index 0000000..36d8501 --- /dev/null +++ b/libs/Tree/Content.php @@ -0,0 +1,19 @@ +value = $this->uri; + } + + protected function getFilename($file) { + $file = DauxHelper::pathinfo($file); + return $file['filename']; + } +} diff --git a/libs/Tree/Directory.php b/libs/Tree/Directory.php new file mode 100644 index 0000000..95873b7 --- /dev/null +++ b/libs/Tree/Directory.php @@ -0,0 +1,43 @@ +value, array($this, 'compare_directory_entries')); + } + + private function compare_directory_entries($a, $b) { + $name_a = explode('_', $a->name); + $name_b = explode('_', $b->name); + if (is_numeric($name_a[0])) { + $a = intval($name_a[0]); + if (is_numeric($name_b[0])) { + $b = intval($name_b[0]); + if (($a >= 0) == ($b >= 0)) { + $a = abs($a); + $b = abs($b); + if ($a == $b) return (strcasecmp($name_a[1], $name_b[1])); + return ($a > $b) ? 1 : -1; + } + return ($a >= 0) ? -1 : 1; + } + $t = $name_b[0]; + if ($t && $t[0] === '-') return -1; + return ($a < 0) ? 1 : -1; + } else { + if (is_numeric($name_b[0])) { + $b = intval($name_b[0]); + if ($b >= 0) return 1; + $t = $name_a[0]; + if ($t && $t[0] === '-') return 1; + return ($b >= 0) ? 1 : -1; + } + $p = $name_a[0]; + $q = $name_b[0]; + if (($p && $p[0] === '-') == ($q && $q[0] === '-')) return strcasecmp($p, $q); + else return ($p[0] === '-') ? 1 : -1; + } + } +} diff --git a/libs/Tree/Entry.php b/libs/Tree/Entry.php new file mode 100644 index 0000000..e3208ff --- /dev/null +++ b/libs/Tree/Entry.php @@ -0,0 +1,86 @@ +local_path = $path; + $this->parents = $parents; + $this->last_modified = filemtime($path); + $this->name = DauxHelper::pathinfo($path)['filename']; + $this->title = $this->get_title_from_filename($this->name); + $this->uri = $this->get_url_from_filename($this->getFilename($path)); + $this->index_page = false; + } + + public function get_url() { + $url = ''; + foreach ($this->parents as $node) { + $url .= $node->uri . '/'; + } + $url .= $this->uri; + return $url; + } + + public function get_first_page() { + foreach ($this->value as $node) { + if ($node instanceof Content && $node->title != 'index') + return $node; + } + foreach ($this->value as $node) { + if ($node instanceof Directory) { + $page = $node->get_first_page(); + if ($page) return $page; + } + } + return false; + } + + public function write($content) { + if (!is_writable($this->local_path)) { + return false; + } + + file_put_contents($this->local_path, $content); + return true; + } + + protected function getFilename($file) { + $parts = explode('/', $file); + return end($parts); + } + + protected function get_title_from_filename($filename) { + $filename = explode('_', $filename); + if ($filename[0] == '' || is_numeric($filename[0])) unset($filename[0]); + else { + $t = $filename[0]; + if ($t[0] == '-') $filename[0] = substr($t, 1); + } + $filename = implode(' ', $filename); + return $filename; + } + + protected function get_url_from_filename($filename) { + $filename = explode('_', $filename); + if ($filename[0] == '' || is_numeric($filename[0])) unset($filename[0]); + else { + $t = $filename[0]; + if ($t[0] == '-') $filename[0] = substr($t, 1); + } + $filename = implode('_', $filename); + return $filename; + } + + } diff --git a/libs/Tree/Raw.php b/libs/Tree/Raw.php new file mode 100644 index 0000000..2a5e471 --- /dev/null +++ b/libs/Tree/Raw.php @@ -0,0 +1,9 @@ +value = $this->uri; + } +} diff --git a/img/favicon.png b/resources/img/favicon.png similarity index 100% rename from img/favicon.png rename to resources/img/favicon.png diff --git a/templates/default/default.tpl b/templates/default/default.tpl index f5c70f8..51aa28f 100644 --- a/templates/default/default.tpl +++ b/templates/default/default.tpl @@ -13,13 +13,14 @@ $nav = ''; foreach ($tree->value as $node) { $url = $node->uri; - if ($node->type === \TodayMade\Daux\Entry::FILE_TYPE) { + if ($node instanceof \Todaymade\Daux\Tree\Content) { if ($node->value === 'index') continue; $nav .= '' . $node->title . ''; - } else { + } + if ($node instanceof \Todaymade\Daux\Tree\Directory) { $nav .= 'value as $url => $node) { - if ($node->type === \TodayMade\Daux\Entry::FILE_TYPE) { + if ($node instanceof \Todaymade\Daux\Tree\Content) { if ($node->value === 'index') continue; $link = ($path === '') ? $url : $path . '/' . $url; $nav .= '
  • ' . $node->title . '
  • '; - } else { + } + if ($node instanceof \Todaymade\Daux\Tree\Directory) { $nav .= '
  • '; $link = ($path === '') ? $url : $path . '/' . $url; if ($node->index_page) $nav .= '' . $node->title . ''; From de1214cbab6f0300df03043044aa6bb3b8ee6486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Thu, 23 Apr 2015 00:32:30 +0200 Subject: [PATCH 006/127] Convert to PSR2 --- generate.php | 2 + index.php | 2 + libs/Daux.php | 288 +++++++++--------- libs/DauxHelper.php | 189 ++++++------ libs/Exception.php | 4 +- libs/Generator/Generator.php | 44 +-- libs/Generator/Helper.php | 63 ++-- libs/MarkdownPage.php | 106 ++++--- libs/Page.php | 4 +- libs/Server/ErrorPage.php | 14 +- libs/Server/Helper.php | 31 +- libs/Server/NotFoundException.php | 4 +- libs/Server/Server.php | 71 +++-- libs/SimplePage.php | 29 +- libs/Tree/Builder.php | 38 +-- libs/Tree/Content.php | 10 +- libs/Tree/Directory.php | 35 ++- libs/Tree/Entry.php | 206 ++++++++----- libs/Tree/Raw.php | 6 +- .../default/{default.tpl => default.php} | 11 +- templates/default/{error.tpl => error.php} | 0 21 files changed, 664 insertions(+), 493 deletions(-) rename templates/default/{default.tpl => default.php} (98%) rename templates/default/{error.tpl => error.php} (100%) diff --git a/generate.php b/generate.php index 2b5589e..e7766b5 100644 --- a/generate.php +++ b/generate.php @@ -65,6 +65,8 @@ software, even if advised of the possibility of such damage. require_once("vendor/autoload.php"); +\Todaymade\Daux\Daux::initConstants(); + $global_config = (isset($argv[1]))? $argv[1] : null; $destination = (isset($argv[2]))? $argv[2] : null; diff --git a/index.php b/index.php index 3f52913..6ad4a24 100644 --- a/index.php +++ b/index.php @@ -65,4 +65,6 @@ software, even if advised of the possibility of such damage. require_once("vendor/autoload.php"); +\Todaymade\Daux\Daux::initConstants(); + \Todaymade\Daux\Server\Server::serve($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], $_REQUEST); diff --git a/libs/Daux.php b/libs/Daux.php index 5e270e4..610c120 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -1,173 +1,183 @@ mode = $mode; - public static $VALID_MARKDOWN_EXTENSIONS; - public $local_base; - public $base_url = ''; - public $host; - private $docs_path; - public $tree; - public $options; - private $mode; + $this->local_base = dirname(__DIR__); + $this->base_url = ''; - public function __construct($mode) { - $this->mode = $mode; - - $this->local_base = dirname(dirname(__FILE__)); - $this->base_url = ''; - - if ($this->mode == Daux::LIVE_MODE) { - $this->host = $_SERVER['HTTP_HOST']; - $this->base_url = $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']); - $t = strrpos($this->base_url, '/index.php'); - if ($t != FALSE) $this->base_url = substr($this->base_url, 0, $t); - if (substr($this->base_url, -1) !== '/') $this->base_url .= '/'; + if ($this->mode == Daux::LIVE_MODE) { + $this->host = $_SERVER['HTTP_HOST']; + $this->base_url = $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']); + $t = strrpos($this->base_url, '/index.php'); + if ($t != false) { + $this->base_url = substr($this->base_url, 0, $t); + } + if (substr($this->base_url, -1) !== '/') { + $this->base_url .= '/'; } } + } - public function initialize($global_config_file = null, $config_file = 'config.json') { - $this->load_global_config($global_config_file); - $this->load_docs_config($config_file); - $this->generate_directory_tree(); + public static function initConstants() + { + define("DS", DIRECTORY_SEPARATOR); + } + + public function initialize($global_config_file = null, $config_file = 'config.json') + { + $this->loadConfig($global_config_file); + $this->loadConfigOverrides($config_file); + $this->generateTree(); + } + + private function loadConfig($global_config_file) + { + if (is_null($global_config_file)) { + $global_config_file = $this->local_base . DS . 'global.json'; + } + if (!file_exists($global_config_file)) { + throw new Exception('The Global Config file is missing. Requested File : ' . $global_config_file); } - private function load_global_config($global_config_file) { - if (is_null($global_config_file)) $global_config_file = $this->local_base . DIRECTORY_SEPARATOR . 'global.json'; - if (!file_exists($global_config_file)) { - throw new Exception('The Global Config file is missing. Requested File : ' . $global_config_file); - } - - $global_config = json_decode(file_get_contents($global_config_file), true); - if (!isset($global_config)) { - throw new Exception('The Global Config file is corrupt. Check that the JSON encoding is correct'); - } - - if (!isset($global_config['docs_directory'])) { - throw new Exception('The Global Config file does not have the docs directory set.'); - } - - $this->docs_path = $global_config['docs_directory']; - if (!is_dir($this->docs_path) && !is_dir($this->docs_path = $this->local_base . DIRECTORY_SEPARATOR . $this->docs_path)) { - throw new Exception('The Docs directory does not exist. Check the path again : ' . $this->docs_path); - } - - if (!isset($global_config['valid_markdown_extensions'])) static::$VALID_MARKDOWN_EXTENSIONS = array('md', 'markdown'); - else static::$VALID_MARKDOWN_EXTENSIONS = $global_config['valid_markdown_extensions']; + $global_config = json_decode(file_get_contents($global_config_file), true); + if (!isset($global_config)) { + throw new Exception('The Global Config file is corrupt. Check that the JSON encoding is correct'); } - private function load_docs_config($config_file) { - $config_file = $this->docs_path . DIRECTORY_SEPARATOR . $config_file; - if (!file_exists($config_file)) { - throw new Exception('The local config file is missing. Check path : ' . $config_file); - } - $this->options = json_decode(file_get_contents($this->local_base . DIRECTORY_SEPARATOR . 'default.json'), true); - if (is_file($config_file)) { - $config = json_decode(file_get_contents($config_file), true); - if (!isset($config)) { - throw new Exception('There was an error parsing the Config file. Please review'); - } - $this->options = array_merge($this->options, $config); - } - if (isset($this->options['timezone'])) date_default_timezone_set($this->options['timezone']); - else if (!ini_get('date.timezone')) date_default_timezone_set('GMT'); + if (!isset($global_config['docs_directory'])) { + throw new Exception('The Global Config file does not have the docs directory set.'); } - private function generate_directory_tree() { - $this->tree = Builder::build($this->docs_path, $this->options['ignore'], $this->mode); - if (!empty($this->options['languages'])) { - foreach ($this->options['languages'] as $key => $node) { - $this->tree->value[$key]->title = $node; - } - } + $this->docs_path = $global_config['docs_directory']; + if (!is_dir($this->docs_path) && !is_dir($this->docs_path = $this->local_base . DS . $this->docs_path)) { + throw new Exception('The Docs directory does not exist. Check the path again : ' . $this->docs_path); } - public function get_base_params() { - $params = array( - //Informations - 'tagline' => $this->options['tagline'], - 'title' => $this->options['title'], - 'author' => $this->options['author'], - 'image' => $this->options['image'], - 'repo' => $this->options['repo'], - 'links' => $this->options['links'], - 'twitter' => $this->options['twitter'], + if (!isset($global_config['valid_markdown_extensions'])) { + static::$VALID_MARKDOWN_EXTENSIONS = array('md', 'markdown'); + } else { + static::$VALID_MARKDOWN_EXTENSIONS = $global_config['valid_markdown_extensions']; + } + } - //Features - 'google_analytics' => ($g = $this->options['google_analytics']) ? DauxHelper::google_analytics($g, $this->host) : '', - 'piwik_analytics' => ($p = $this->options['piwik_analytics']) ? DauxHelper::piwik_analytics($p, $this->options['piwik_analytics_id']) : '', - 'toggle_code' => $this->options['toggle_code'], - 'float' => $this->options['float'], - 'date_modified' => $this->options['date_modified'], - 'file_editor' => false, - 'breadcrumbs' => $this->options['breadcrumbs'], - 'breadcrumb_separator' => $this->options['breadcrumb_separator'], - 'multilanguage' => !empty($this->options['languages']), - 'languages' => $this->options['languages'], + private function loadConfigOverrides($config_file) + { + $config_file = $this->docs_path . DS . $config_file; + if (!file_exists($config_file)) { + throw new Exception('The local config file is missing. Check path : ' . $config_file); + } + $this->options = json_decode(file_get_contents($this->local_base . DS . 'default.json'), true); + if (is_file($config_file)) { + $config = json_decode(file_get_contents($config_file), true); + if (!isset($config)) { + throw new Exception('There was an error parsing the Config file. Please review'); + } + $this->options = array_merge($this->options, $config); + } + if (isset($this->options['timezone'])) { + date_default_timezone_set($this->options['timezone']); + } elseif (!ini_get('date.timezone')) { + date_default_timezone_set('GMT'); + } + } + + private function generateTree() + { + $this->tree = Builder::build($this->docs_path, $this->options['ignore'], $this->getParams()); + if (!empty($this->options['languages'])) { + foreach ($this->options['languages'] as $key => $node) { + $this->tree->value[$key]->title = $node; + } + } + } + + public function getParams() + { + $params = array( + //Informations + 'tagline' => $this->options['tagline'], + 'title' => $this->options['title'], + 'author' => $this->options['author'], + 'image' => $this->options['image'], + 'repo' => $this->options['repo'], + 'links' => $this->options['links'], + 'twitter' => $this->options['twitter'], + + //Features + 'google_analytics' => ($g = $this->options['google_analytics']) ? + DauxHelper::googleAnalytics($g, $this->host) : '', + 'piwik_analytics' => ($p = $this->options['piwik_analytics']) ? + DauxHelper::piwikAnalytics($p, $this->options['piwik_analytics_id']) : '', + 'toggle_code' => $this->options['toggle_code'], + 'float' => $this->options['float'], + 'date_modified' => $this->options['date_modified'], + 'file_editor' => false, + 'breadcrumbs' => $this->options['breadcrumbs'], + 'breadcrumb_separator' => $this->options['breadcrumb_separator'], + 'multilanguage' => !empty($this->options['languages']), + 'languages' => $this->options['languages'], - //Paths and tree - 'mode' => $this->mode, - 'local_base' => $this->local_base, - 'docs_path' => $this->docs_path, - 'tree' => $this->tree, - 'index' => ($this->tree->index_page !== false) ? $this->tree->index_page : $this->tree->first_page, - 'template' => $this->options['template'], - ); + //Paths and tree + 'mode' => $this->mode, + 'local_base' => $this->local_base, + 'docs_path' => $this->docs_path, + 'template' => $this->options['template'], + ); - if (!$params['multilanguage']) { + if ($this->tree) { + $params['tree'] = $this->tree; + $params['index'] = ($index = $this->tree->getIndexPage()) ? $index : $this->tree->getFirstPage(); + if ($params['multilanguage']) { foreach ($this->options['languages'] as $key => $name) { - $params['entry_page'][$key] = $this->tree->value[$key]->first_page; + $params['entry_page'][$key] = $this->tree->value[$key]->getFirstPage(); } } else { - $params['entry_page'] = $this->tree->first_page; + $params['entry_page'] = $this->tree->getFirstPage(); } - - return $params; } - //TODO :: move to generator - public function get_page_params() { - $params = $this->get_base_params(); - - $params['index_key'] = 'index.html'; - $params['base_page'] = $params['base_url'] = ''; - - $params['theme'] = DauxHelper::get_theme( - $this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'], - $params['base_url'], - $this->local_base, - $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/' - ); - - return $params; - } - - //TODO :: move to server - public function get_live_page_params() { - $params = $this->get_base_params(); - + if ($this->mode == self::LIVE_MODE) { $params['index_key'] = 'index'; $params['host'] = $this->host; $params['base_page'] = $params['base_url'] = '//' . $this->base_url; - if (!$this->options['clean_urls']) $params['base_page'] .= 'index.php/'; + if (!$this->options['clean_urls']) { + $params['base_page'] .= 'index.php/'; + } - if ($params['image'] !== '') $params['image'] = str_replace('', $params['base_url'], $params['image']); - - $params['theme'] = DauxHelper::get_theme( - $this->local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $this->options['template'] . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $this->options['theme'], - $params['base_url'], - $this->local_base, - $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/' - ); - - return $params; + if ($params['image'] !== '') { + $params['image'] = str_replace('', $params['base_url'], $params['image']); + } + } else { + $params['index_key'] = 'index.html'; + $params['base_page'] = $params['base_url'] = ''; } + + $params['theme'] = DauxHelper::getTheme( + $this->local_base . DS . 'templates' . DS . $this->options['template'] . DS . 'themes' . DS . $this->options['theme'], + $params['base_url'], + $this->local_base, + $params['base_url'] . "templates/" . $params['template'] . "/themes/" . $this->options['theme'] . '/' + ); + + return $params; } +} diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index 82753c4..27432ec 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -1,111 +1,130 @@ ', $request); - return $request; - case 'Colons': - $request = str_replace('/', ': ', $request); - return $request; - case 'Spaces': - $request = str_replace('/', ' ', $request); - return $request; - default: - $request = str_replace('/', $separator, $request); - return $request; + public static function getBreadcrumbFromRequest($request, $separator = 'Chevrons', $multilanguage = false) + { + if ($multilanguage) { + $request = substr($request, strpos($request, '/') + 1); + } + $request = str_replace('_', ' ', $request); + switch ($separator) { + case 'Chevrons': + $request = str_replace('/', ' ', $request); + return $request; + case 'Colons': + $request = str_replace('/', ': ', $request); + return $request; + case 'Spaces': + $request = str_replace('/', ' ', $request); + return $request; + default: + $request = str_replace('/', $separator, $request); + return $request; + } + return $request; + } + + public static function getTheme($theme_folder, $base_url, $local_base, $theme_url) + { + $name = static::pathinfo($theme_folder); + + $theme = array(); + if (is_file($theme_folder . DS . "config.json")) { + $theme = json_decode(file_get_contents($theme_folder . DS . "config.json"), true); + if (!$theme) { + $theme = array(); } - return $request; + } + $theme['name'] = $name['filename']; + + //Default parameters for theme + $theme += [ + 'css' => [], + 'js' => [], + 'fonts' => [], + 'require-jquery' => false, + 'bootstrap-js' => false, + 'favicon' => 'resources/img/favicon.png', + 'template' => $local_base . DS . 'templates' . DS . 'default/default.php', + 'error-template' => $local_base . DS . 'templates' . DS . 'default/error.php', + ]; + + $substitutions = ['' => $local_base, '' => $base_url, '' => $theme_url]; + + // Substitute some placeholders + $theme['template'] = strtr($theme['template'], $substitutions); + $theme['error-template'] = strtr($theme['error-template'], $substitutions); + $theme['favicon'] = utf8_encode(strtr($theme['favicon'], $substitutions)); + + foreach ($theme['css'] as $key => $css) { + $theme['css'][$key] = utf8_encode(strtr($css, $substitutions)); } - public static function get_theme($theme_folder, $base_url, $local_base, $theme_url) { - $name = static::pathinfo($theme_folder); - - $theme = array(); - if (is_file($theme_folder . DIRECTORY_SEPARATOR . "config.json")) { - $theme = json_decode(file_get_contents($theme_folder . DIRECTORY_SEPARATOR . "config.json"), true); - if (!$theme) $theme = array(); - } - $theme['name'] = $name['filename']; - - //Default parameters for theme - $theme += [ - 'css' => [], - 'js' => [], - 'fonts' => [], - 'require-jquery' => false, - 'bootstrap-js' => false, - 'favicon' => 'resources/img/favicon.png', - 'template' => $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/default.tpl', - 'error-template' => $local_base . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'default/error.tpl', - ]; - - $substitutions = ['' => $local_base, '' => $base_url, '' => $theme_url]; - - // Substitute some placeholders - $theme['template'] = strtr($theme['template'], $substitutions); - $theme['error-template'] = strtr($theme['error-template'], $substitutions); - $theme['favicon'] = utf8_encode(strtr($theme['favicon'], $substitutions)); - - foreach ($theme['css'] as $key => $css) { - $theme['css'][$key] = utf8_encode(strtr($css, $substitutions)); - } - - foreach ($theme['fonts'] as $key => $font) { - $theme['fonts'][$key] = utf8_encode(strtr($font, $substitutions)); - } - - foreach ($theme['js'] as $key => $js) { - $theme['js'][$key] = utf8_encode(strtr($js, $substitutions)); - } - - return $theme; + foreach ($theme['fonts'] as $key => $font) { + $theme['fonts'][$key] = utf8_encode(strtr($font, $substitutions)); } - public static function google_analytics($analytics, $host) { - $ga = << $js) { + $theme['js'][$key] = utf8_encode(strtr($js, $substitutions)); + } + + return $theme; + } + + public static function googleAnalytics($analytics, $host) + { + $ga = << (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); EOT; - $ga .= "ga('create', '" . $analytics . "', '" . $host . "');"; - $ga .= "ga('send', 'pageview');"; - $ga .= ''; - return $ga; - } + $ga .= "ga('create', '" . $analytics . "', '" . $host . "');"; + $ga .= "ga('send', 'pageview');"; + $ga .= ''; + return $ga; + } - public static function piwik_analytics($analytics_url, $analytics_id) { - $pa = << var _paq = _paq || []; _paq.push(["trackPageView"]); _paq.push(["enableLinkTracking"]); (function() { EOT; - $pa .= 'var u=(("https:" == document.location.protocol) ? "https" : "http") + "://' . $analytics_url . '/";'; - $pa .= '_paq.push(["setTrackerUrl", u+"piwik.php"]);'; - $pa .= '_paq.push(["setSiteId", ' . $analytics_id . ']);'; - $pa .= << EOT; - return $pa; - } - - public static function pathinfo($path) { - preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $m); - if (isset($m[1])) $ret['dir']=$m[1]; - if (isset($m[2])) $ret['basename']=$m[2]; - if (isset($m[5])) $ret['extension']=$m[5]; - if (isset($m[3])) $ret['filename']=$m[3]; - return $ret; - } + return $pa; } + + public static function pathinfo($path) + { + preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $m); + if (isset($m[1])) { + $ret['dir']=$m[1]; + } + if (isset($m[2])) { + $ret['basename']=$m[2]; + } + if (isset($m[5])) { + $ret['extension']=$m[5]; + } + if (isset($m[3])) { + $ret['filename']=$m[3]; + } + return $ret; + } +} diff --git a/libs/Exception.php b/libs/Exception.php index 9ccaa45..3e8f2d5 100644 --- a/libs/Exception.php +++ b/libs/Exception.php @@ -1,5 +1,5 @@ initialize($global_config); - $this->generate_static($daux, $destination); + $params = $daux->getParams(); + if (is_null($destination)) { + $destination = $daux->local_base . DS . 'static'; + } + + Helper::copyAssets($destination, $daux->local_base); + + $this->generateRecursive($daux->tree, $destination, $params); } - public function generate_static(Daux $daux, $output_dir = NULL) { - $params = $daux->get_page_params(); - if (is_null($output_dir)) $output_dir = $daux->local_base . DIRECTORY_SEPARATOR . 'static'; - Helper::clean_copy_assets($output_dir, $daux->local_base); - $this->recursive_generate_static($daux->tree, $output_dir, $params); - } - - private function recursive_generate_static($tree, $output_dir, $params, $base_url = '') { + private function generateRecursive($tree, $output_dir, $params, $base_url = '') + { $params['base_url'] = $params['base_page'] = $base_url; $new_params = $params; // $params['image'] = str_replace('', $base_url, $params['image']); - if ($base_url !== '') $params['entry_page'] = $tree->first_page; + if ($base_url !== '') { + $params['entry_page'] = $tree->getFirstPage(); + } foreach ($tree->value as $key => $node) { if ($node instanceof Directory) { - $new_output_dir = $output_dir . DIRECTORY_SEPARATOR . $key; + $new_output_dir = $output_dir . DS . $key; @mkdir($new_output_dir); - $this->recursive_generate_static($node, $new_output_dir, $new_params, '../' . $base_url); - } else if ($node instanceof Content) { - $params['request'] = $node->get_url(); - $params['file_uri'] = $node->name; + $this->generateRecursive($node, $new_output_dir, $new_params, '../' . $base_url); + } elseif ($node instanceof Content) { + $params['request'] = $node->getUrl(); + $params['file_uri'] = $node->getName(); $page = MarkdownPage::fromFile($node, $params); - file_put_contents($output_dir . DIRECTORY_SEPARATOR . $key, $page->get_page_content()); + file_put_contents($output_dir . DS . $key, $page->getContent()); } else { - copy($node->local_path, $output_dir . DIRECTORY_SEPARATOR . $key); + copy($node->getPath(), $output_dir . DS . $key); } } } diff --git a/libs/Generator/Helper.php b/libs/Generator/Helper.php index ef1ae33..e56b941 100644 --- a/libs/Generator/Helper.php +++ b/libs/Generator/Helper.php @@ -1,48 +1,55 @@ getFilename() === '.' || $file->getFilename() === '..') continue; - if ($file->isDir()) rmdir($file->getRealPath()); - else unlink($file->getRealPath()); + foreach ($files as $file) { + if ($file->getFilename() === '.' || $file->getFilename() === '..') { + continue; + } + if ($file->isDir()) { + rmdir($file->getRealPath()); + } else { + unlink($file->getRealPath()); + } } } - private static function copy_recursive($src,$dst) { + private static function copyRecursive($src, $dst) + { $dir = opendir($src); @mkdir($dst); - while(false !== ( $file = readdir($dir)) ) { + while (false !== ( $file = readdir($dir))) { if (( $file != '.' ) && ( $file != '..' )) { - if ( is_dir($src . '/' . $file) ) { - static::copy_recursive($src . '/' . $file,$dst . '/' . $file); - } - else { - copy($src . '/' . $file,$dst . '/' . $file); + if (is_dir($src . '/' . $file)) { + static::copyRecursive($src . '/' . $file, $dst . '/' . $file); + } else { + copy($src . '/' . $file, $dst . '/' . $file); } } } diff --git a/libs/MarkdownPage.php b/libs/MarkdownPage.php index a1fe68e..45f7c4f 100644 --- a/libs/MarkdownPage.php +++ b/libs/MarkdownPage.php @@ -1,49 +1,54 @@ initialize_from_file($file, $params); + $instance->initialize($file, $params); return $instance; } - private function initialize_from_file($file, $params) { - $this->title = $file->title; - $this->filename = $file->name; - $this->path = $file->local_path; - $this->mtime = $file->last_modified; + private function initialize(Content $file, $params) + { + $this->file = $file; $this->params = $params; + $this->title = $file->title; if ($this->title === 'index') { - $this->homepage = ($this->filename === '_index'); + $this->homepage = ($this->file->getName() === '_index'); $minimum_parent_dir_size = ($params['multilanguage']) ? 2 : 1; - if (count($file->parents) >= $minimum_parent_dir_size) { - $parent = end($file->parents); - $this->title = $parent->title; - } else $this->title = $params['title']; + if (count($file->getParents()) >= $minimum_parent_dir_size) { + $parents = $file->getParents(); + $parent = end($parents); + $this->title = $parent->getTitle(); + } else { + $this->title = $params['title']; + } } else { $this->homepage = false; } - if ($params['breadcrumbs']) - $this->breadcrumb_trail = $this->build_breadcrumb_trail($file->parents, $params['multilanguage']); + if ($params['breadcrumbs']) { + $this->breadcrumb_trail = $this->buildBreadcrumbTrail($file->getParents(), $params['multilanguage']); + } $this->language = ''; - if ($params['multilanguage'] && !empty($file->parents)) { - reset($file->parents); - $language_dir = current($file->parents); + if ($params['multilanguage'] && count($file->getParents())) { + reset($file->getParents()); + $language_dir = current($file->getParents()); $this->language = $language_dir->name; } if (is_null(static::$template)) { @@ -52,63 +57,70 @@ class MarkdownPage extends SimplePage } } - private function build_breadcrumb_trail($parents, $multilanguage) { - if ($multilanguage && !empty($parents)) $parents = array_splice($parents, 1); + private function buildBreadcrumbTrail($parents, $multilanguage) + { + if ($multilanguage && !empty($parents)) { + $parents = array_splice($parents, 1); + } $breadcrumb_trail = array(); if (!empty($parents)) { foreach ($parents as $node) { - $breadcrumb_trail[$node->title] = $node->get_url(); + $breadcrumb_trail[$node->getTitle()] = $node->getUrl(); } } return $breadcrumb_trail; } - public function get_page_content() { + public function getContent() + { if (is_null($this->html)) { - $this->content = file_get_contents($this->path); - $this->html = $this->generate_page(); + $this->content = file_get_contents($this->file->getPath()); + $this->html = $this->generatePage(); } return $this->html; } - private function generate_page() { + private function generatePage() + { $params = $this->params; - $Parsedown = new \Parsedown(); + $entry_page = []; - //TODO :: debug entry pages - //if ($params['request'] === $params['index_key']) { - // if ($params['multilanguage']) { - // foreach ($params['languages'] as $key => $name) { - // $entry_page[utf8_encode($name)] = utf8_encode($params['base_page'] . $params['entry_page'][$key]->get_url()); - // } - // } else $entry_page['View Documentation'] = utf8_encode($params['base_page'] . $params['entry_page']->uri); - //} else if ($params['file_uri'] === 'index') { - // $entry_page[utf8_encode($params['entry_page']->title)] = utf8_encode($params['base_page'] . $params['entry_page']->get_url()); - //} - - $page['entry_page'] = (isset($entry_page)) ? $entry_page : null; + if ($params['request'] === $params['index_key']) { + if ($params['multilanguage']) { + foreach ($params['languages'] as $key => $name) { + $entry_page[utf8_encode($name)] = utf8_encode($params['base_page'] . $params['entry_page'][$key]->getUrl()); + } + } else { + $entry_page['View Documentation'] = utf8_encode($params['base_page'] . $params['entry_page']->getUri()); + } + } elseif ($params['file_uri'] === 'index') { + $entry_page[utf8_encode($params['entry_page']->title)] = utf8_encode($params['base_page'] . $params['entry_page']->getUrl()); + } + $page['entry_page'] = $entry_page; $page['homepage'] = $this->homepage; - $page['title'] = $this->title; + $page['title'] = $this->file->getTitle(); $page['tagline'] = $params['tagline']; $page['author'] = $params['author']; - $page['filename'] = $this->filename; + $page['filename'] = $this->file->getName(); if ($page['breadcrumbs'] = $params['breadcrumbs']) { $page['breadcrumb_trail'] = $this->breadcrumb_trail; $page['breadcrumb_separator'] = $params['breadcrumb_separator']; } $page['language'] = $this->language; - $page['path'] = $this->path; + $page['path'] = $this->file->getPath(); $page['request'] = utf8_encode($params['request']); $page['theme'] = $params['theme']; - $page['modified_time'] = filemtime($this->path); + $page['modified_time'] = filemtime($this->file->getPath()); $page['markdown'] = $this->content; - $page['content'] = $Parsedown->text($this->content); $page['file_editor'] = $params['file_editor']; $page['google_analytics'] = $params['google_analytics']; $page['piwik_analytics'] = $params['piwik_analytics']; + $Parsedown = new \Parsedown(); + $page['content'] = $Parsedown->text($this->content); + return static::$template->get_content($page, $params); } } diff --git a/libs/Page.php b/libs/Page.php index d17b952..1668b34 100644 --- a/libs/Page.php +++ b/libs/Page.php @@ -2,6 +2,6 @@ interface Page { - function get_page_content(); - function display(); + public function getContent(); + public function display(); } diff --git a/libs/Server/ErrorPage.php b/libs/Server/ErrorPage.php index 3918f81..9546b65 100644 --- a/libs/Server/ErrorPage.php +++ b/libs/Server/ErrorPage.php @@ -12,28 +12,32 @@ class ErrorPage extends SimplePage private $params; private static $template; - public function __construct($title, $content, $params) { + public function __construct($title, $content, $params) + { parent::__construct($title, $content); $this->params = $params; } - public function display() { + public function display() + { http_response_code(404); parent::display(); } - public function get_page_content() { + public function getContent() + { include_once($this->params['theme']['error-template']); static::$template = new Template(); if (is_null($this->html)) { - $this->html = $this->generate_page(); + $this->html = $this->generatePage(); } return $this->html; } - public function generate_page() { + private function generatePage() + { $params = $this->params; $page['title'] = $this->title; $page['theme'] = $params['theme']; diff --git a/libs/Server/Helper.php b/libs/Server/Helper.php index 029ec6f..711689d 100644 --- a/libs/Server/Helper.php +++ b/libs/Server/Helper.php @@ -1,17 +1,21 @@ initialize(); $server = new static($daux); - $page = $server->handle($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], $_REQUEST); - } - catch( NotFoundException $e ) - { - $page = new ErrorPage("An error occured", $e->getMessage(), $daux->get_live_page_params()); + $page = $server->handle($_REQUEST); + } catch (NotFoundException $e) { + $page = new ErrorPage("An error occured", $e->getMessage(), $daux->getParams()); } $page->display(); } - public function __construct(Daux $daux) { + public function __construct(Daux $daux) + { $this->daux = $daux; } - public function handle($url, $query = []) { - $this->params = $this->daux->get_live_page_params(); + public function handle($query = []) + { + $this->params = $this->daux->getParams(); - $request = Helper::get_request(); + $request = Helper::getRequest(); $request = urldecode($request); $request_type = isset($query['method']) ? $query['method'] : ''; - if($request == 'first_page') { + if ($request == 'first_page') { $request = $this->daux->tree->first_page->uri; } switch ($request_type) { @@ -48,24 +50,30 @@ class Server { } $content = isset($query['markdown']) ? $query['markdown'] : ''; - return $this->save_file($request, $content); + return $this->saveFile($request, $content); default: - return $this->get_page($request); + return $this->getPage($request); } } - private function save_file($request, $content) { - $file = $this->get_file_from_request($request); + private function saveFile($request, $content) + { + $file = $this->getFile($request); - if ($file === false) throw new NotFoundException('The Page you requested is yet to be made. Try again later.'); + if ($file === false) { + throw new NotFoundException('The Page you requested is yet to be made. Try again later.'); + } - if (!$file->write($content)) throw new Exception('The file you wish to write to is not writable.'); + if (!$file->write($content)) { + throw new Exception('The file you wish to write to is not writable.'); + } return new SimplePage('Success', 'Successfully Edited'); } - private function get_file_from_request($request) { + private function getFile($request) + { $tree = $this->daux->tree; $request = explode('/', $request); foreach ($request as $node) { @@ -90,7 +98,7 @@ class Server { return false; } - return $tree->index_page; + return $tree->getIndexPage(); } // If the entry we found is not a directory, we're done @@ -98,21 +106,26 @@ class Server { return $tree; } - if ($tree->index_page){ - return $tree->index_page; + if ($tree->getIndexPage()) { + return $tree->getIndexPage(); } - return ($get_first_file) ? $tree->first_page : false; + return false; } - private function get_page($request) { + private function getPage($request) + { $params = $this->params; - $file = $this->get_file_from_request($request); - if ($file === false) throw new NotFoundException('The Page you requested is yet to be made. Try again later.'); + $file = $this->getFile($request); + if ($file === false) { + throw new NotFoundException('The Page you requested is yet to be made. Try again later.'); + } $params['request'] = $request; $params['file_uri'] = $file->value; - if ($request !== 'index') $params['entry_page'] = $file->first_page; + if ($request !== 'index') { + $params['entry_page'] = $file->first_page; + } return MarkdownPage::fromFile($file, $params); } } diff --git a/libs/SimplePage.php b/libs/SimplePage.php index 2d5f788..6f41488 100644 --- a/libs/SimplePage.php +++ b/libs/SimplePage.php @@ -6,29 +6,34 @@ class SimplePage implements Page protected $content; protected $html = null; - public function __construct($title, $content) { - $this->initialize_page($title, $content); + public function __construct($title, $content) + { + $this->initializePage($title, $content); } - public function initialize_page($title, $content) { - $this->title = $title; - $this->content = $content; - } - - public function display() { + public function display() + { header('Content-type: text/html; charset=utf-8'); - echo $this->get_page_content(); + echo $this->getContent(); } - public function get_page_content() { + public function getContent() + { if (is_null($this->html)) { - $this->html = $this->generate_page(); + $this->html = $this->generatePage(); } return $this->html; } - private function generate_page() { + private function initializePage($title, $content) + { + $this->title = $title; + $this->content = $content; + } + + private function generatePage() + { return $this->content; } } diff --git a/libs/Tree/Builder.php b/libs/Tree/Builder.php index 88d69db..c5258c4 100644 --- a/libs/Tree/Builder.php +++ b/libs/Tree/Builder.php @@ -3,8 +3,10 @@ use Todaymade\Daux\Daux; use Todaymade\Daux\DauxHelper; -class Builder { - public static function build($dir, $ignore, $mode = Daux::LIVE_MODE, $parents = null) { +class Builder +{ + public static function build($dir, $ignore, $params, $parents = null) + { if (!$dh = opendir($dir)) { return; } @@ -14,7 +16,7 @@ class Builder { $new_parents = $parents; if (is_null($new_parents)) { $new_parents = array(); - } else{ + } else { $new_parents[] = $node; } @@ -23,9 +25,12 @@ class Builder { continue; } - $path = $dir . DIRECTORY_SEPARATOR . $file; + $path = $dir . DS . $file; - if ((is_dir($path) && in_array($file, $ignore['folders'])) || (!is_dir($path) && in_array($file, $ignore['files']))) { + if (is_dir($path) && in_array($file, $ignore['folders'])) { + continue; + } + if (!is_dir($path) && in_array($file, $ignore['files'])) { continue; } @@ -33,30 +38,29 @@ class Builder { $entry = null; if (is_dir($path)) { - $entry = static::build($path, $ignore, $mode, $new_parents); - } else if(in_array($file_details['extension'], Daux::$VALID_MARKDOWN_EXTENSIONS)) { + $entry = static::build($path, $ignore, $params, $new_parents); + } elseif (in_array($file_details['extension'], Daux::$VALID_MARKDOWN_EXTENSIONS)) { $entry = new Content($path, $new_parents); - if ($mode === Daux::STATIC_MODE) { - $entry->uri .= '.html'; + if ($params['mode'] === Daux::STATIC_MODE) { + $entry->setUri($entry->getUri() . '.html'); } } else { $entry = new Raw($path, $new_parents); } if ($entry instanceof Entry) { - $node->value[$entry->uri] = $entry; + $node->value[$entry->getUri()] = $entry; } } $node->sort(); - $node->first_page = $node->get_first_page(); - $index_key = ($mode === Daux::LIVE_MODE) ? 'index' : 'index.html'; - if (isset($node->value[$index_key])) { - $node->value[$index_key]->first_page = $node->first_page; - $node->index_page = $node->value[$index_key]; - } else $node->index_page = false; + if (isset($node->value[$params['index_key']])) { + $node->value[$params['index_key']]->setFirstPage($node->getFirstPage()); + $node->setIndexPage($node->value[$params['index_key']]); + } else { + $node->setIndexPage(false); + } return $node; - } } diff --git a/libs/Tree/Content.php b/libs/Tree/Content.php index 36d8501..7941e3b 100644 --- a/libs/Tree/Content.php +++ b/libs/Tree/Content.php @@ -2,17 +2,19 @@ use Todaymade\Daux\DauxHelper; -class Content extends Entry { - +class Content extends Entry +{ public $title; - public function __construct($path = '', $parents = array()) { + public function __construct($path = '', $parents = array()) + { parent::__construct($path, $parents); $this->value = $this->uri; } - protected function getFilename($file) { + protected function getFilename($file) + { $file = DauxHelper::pathinfo($file); return $file['filename']; } diff --git a/libs/Tree/Directory.php b/libs/Tree/Directory.php index 95873b7..9d128e3 100644 --- a/libs/Tree/Directory.php +++ b/libs/Tree/Directory.php @@ -1,14 +1,16 @@ value, array($this, 'compare_directory_entries')); + public function sort() + { + uasort($this->value, array($this, 'compareEntries')); } - private function compare_directory_entries($a, $b) { + private function compareEntries($a, $b) + { $name_a = explode('_', $a->name); $name_b = explode('_', $b->name); if (is_numeric($name_a[0])) { @@ -18,26 +20,37 @@ class Directory extends Entry { if (($a >= 0) == ($b >= 0)) { $a = abs($a); $b = abs($b); - if ($a == $b) return (strcasecmp($name_a[1], $name_b[1])); + if ($a == $b) { + return (strcasecmp($name_a[1], $name_b[1])); + } return ($a > $b) ? 1 : -1; } return ($a >= 0) ? -1 : 1; } $t = $name_b[0]; - if ($t && $t[0] === '-') return -1; + if ($t && $t[0] === '-') { + return -1; + } return ($a < 0) ? 1 : -1; } else { if (is_numeric($name_b[0])) { $b = intval($name_b[0]); - if ($b >= 0) return 1; + if ($b >= 0) { + return 1; + } $t = $name_a[0]; - if ($t && $t[0] === '-') return 1; + if ($t && $t[0] === '-') { + return 1; + } return ($b >= 0) ? 1 : -1; } $p = $name_a[0]; $q = $name_b[0]; - if (($p && $p[0] === '-') == ($q && $q[0] === '-')) return strcasecmp($p, $q); - else return ($p[0] === '-') ? 1 : -1; + if (($p && $p[0] === '-') == ($q && $q[0] === '-')) { + return strcasecmp($p, $q); + } else { + return ($p[0] === '-') ? 1 : -1; + } } } } diff --git a/libs/Tree/Entry.php b/libs/Tree/Entry.php index e3208ff..aca1722 100644 --- a/libs/Tree/Entry.php +++ b/libs/Tree/Entry.php @@ -2,85 +2,149 @@ use Todaymade\Daux\DauxHelper; - abstract class Entry +abstract class Entry +{ + protected $title; + protected $name; + protected $index_page; + protected $first_page; + protected $uri; + protected $local_path; + protected $last_modified; + protected $parents; + + public function __construct($path = '', $parents = array()) { - public $title; - public $name; - public $index_page; - public $first_page; - public $uri; - public $local_path; - public $last_modified; - public $parents; + if (!isset($path) || $path == '' || !file_exists($path)) { + return; + } + $this->local_path = $path; + $this->parents = $parents; + $this->last_modified = filemtime($path); + $this->name = DauxHelper::pathinfo($path)['filename']; + $this->title = $this->getTitleInternal($this->name); + $this->uri = $this->getUrlInternal($this->getFilename($path)); + $this->index_page = false; + } + public function getName() + { + return $this->name; + } - function __construct($path = '', $parents = array()) { - if (!isset($path) || $path == '' || !file_exists($path)) return; - $this->local_path = $path; - $this->parents = $parents; - $this->last_modified = filemtime($path); - $this->name = DauxHelper::pathinfo($path)['filename']; - $this->title = $this->get_title_from_filename($this->name); - $this->uri = $this->get_url_from_filename($this->getFilename($path)); - $this->index_page = false; + public function setUri($uri) + { + $this->uri = $uri; + } + + public function getUri() + { + return $this->uri; + } + + public function getUrl() + { + $url = ''; + foreach ($this->parents as $node) { + $url .= $node->uri . '/'; + } + $url .= $this->uri; + return $url; + } + + public function getIndexPage() + { + return $this->index_page; + } + + public function setIndexPage($index_page) + { + $this->index_page = $index_page; + } + + public function getFirstPage() + { + if ($this->first_page) { + return $this->first_page; } - public function get_url() { - $url = ''; - foreach ($this->parents as $node) { - $url .= $node->uri . '/'; + foreach ($this->value as $node) { + if ($node instanceof Content && $node->title != 'index') { + $this->first_page = $node; + return $node; } - $url .= $this->uri; - return $url; } + foreach ($this->value as $node) { + if ($node instanceof Directory && $page = $node->getFirstPage()) { + $this->first_page = $page; + return $page; + } + } + return false; + } - public function get_first_page() { - foreach ($this->value as $node) { - if ($node instanceof Content && $node->title != 'index') - return $node; - } - foreach ($this->value as $node) { - if ($node instanceof Directory) { - $page = $node->get_first_page(); - if ($page) return $page; - } - } + public function setFirstPage($first_page) + { + $this->first_page = $first_page; + } + + public function getTitle() + { + return $this->title; + } + + public function getParents() + { + return $this->parents; + } + + public function getPath() + { + return $this->local_path; + } + + public function write($content) + { + if (!is_writable($this->local_path)) { return false; } - public function write($content) { - if (!is_writable($this->local_path)) { - return false; - } - - file_put_contents($this->local_path, $content); - return true; - } - - protected function getFilename($file) { - $parts = explode('/', $file); - return end($parts); - } - - protected function get_title_from_filename($filename) { - $filename = explode('_', $filename); - if ($filename[0] == '' || is_numeric($filename[0])) unset($filename[0]); - else { - $t = $filename[0]; - if ($t[0] == '-') $filename[0] = substr($t, 1); - } - $filename = implode(' ', $filename); - return $filename; - } - - protected function get_url_from_filename($filename) { - $filename = explode('_', $filename); - if ($filename[0] == '' || is_numeric($filename[0])) unset($filename[0]); - else { - $t = $filename[0]; - if ($t[0] == '-') $filename[0] = substr($t, 1); - } - $filename = implode('_', $filename); - return $filename; - } - + file_put_contents($this->local_path, $content); + return true; } + + protected function getFilename($file) + { + $parts = explode('/', $file); + return end($parts); + } + + protected function getTitleInternal($filename) + { + $filename = explode('_', $filename); + if ($filename[0] == '' || is_numeric($filename[0])) { + unset($filename[0]); + } else { + $t = $filename[0]; + if ($t[0] == '-') { + $filename[0] = substr($t, 1); + } + } + $filename = implode(' ', $filename); + return $filename; + } + + protected function getUrlInternal($filename) + { + $filename = explode('_', $filename); + if ($filename[0] == '' || is_numeric($filename[0])) { + unset($filename[0]); + } else { + $t = $filename[0]; + if ($t[0] == '-') { + $filename[0] = substr($t, 1); + } + } + $filename = implode('_', $filename); + return $filename; + } +} diff --git a/libs/Tree/Raw.php b/libs/Tree/Raw.php index 2a5e471..50e1016 100644 --- a/libs/Tree/Raw.php +++ b/libs/Tree/Raw.php @@ -1,7 +1,9 @@ value = $this->uri; diff --git a/templates/default/default.tpl b/templates/default/default.php similarity index 98% rename from templates/default/default.tpl rename to templates/default/default.php index 51aa28f..b78cc38 100644 --- a/templates/default/default.tpl +++ b/templates/default/default.php @@ -12,13 +12,14 @@ private function build_navigation($tree, $path, $current_url, $base_page, $mode) { $nav = ''; foreach ($tree->value as $node) { - $url = $node->uri; + $url = $node->getUri(); if ($node instanceof \Todaymade\Daux\Tree\Content) { + if ($node->value === 'index') continue; $nav .= '' . $node->title . '
  • '; + $nav .= '>' . $node->getTitle() . ''; } if ($node instanceof \Todaymade\Daux\Tree\Directory) { $nav .= 'index_page) $nav .= '' . - $node->title . ''; - else $nav .= '' . $node->title . ''; + if ($node->getIndexPage()) $nav .= '' . + $node->getTitle() . ''; + else $nav .= '' . $node->getTitle() . ''; $nav .= ''; - return $nav; - } - - private function build_navigation($tree, $path, $current_url, $base_page, $mode) { - $nav = ''; - foreach ($tree->value as $node) { - $url = $node->getUri(); - if ($node instanceof \Todaymade\Daux\Tree\Content) { - - if ($node->value === 'index') continue; - $nav .= '' . $node->getTitle() . ''; - } - if ($node instanceof \Todaymade\Daux\Tree\Directory) { - $nav .= 'getIndexPage()) $nav .= '' . - $node->getTitle() . ''; - else $nav .= '' . $node->getTitle() . ''; - $nav .= ''; - } - } - return $nav; - } - - private function get_breadcrumb_title($page, $base_page) { - $title = ''; - $breadcrumb_trail = $page['breadcrumb_trail']; - $separator = $this->get_separator($page['breadcrumb_separator']); - foreach ($breadcrumb_trail as $key => $value) { - $title .= '' . $key . '' . $separator; - } - if ($page['filename'] === 'index' || $page['filename'] === '_index') { - if ($page['title'] != '') $title = substr($title, 0, -1 * strlen($separator)); - } else $title .= '' . $page['title'] . ''; - return $title; - } - - private function get_separator($separator) { - switch ($separator) { - case 'Chevrons': - return ' '; - default: - return $separator; - } - } - - public function get_content($page, $params) { - $base_url = $params['base_url']; - $base_page = $params['base_page']; - $homepage = $page['homepage']; - $project_title = utf8_encode($params['title']); - $index = utf8_encode($base_page . $params['index']->value); - $tree = $params['tree']; - $entry_page = $page['entry_page']; - ob_start(); -?> - - - - - - - <?php echo $page['title']; ?> - - - - - - - - - - "; ?> - - - "; ?> - - - - - - - - Fork me on GitHub - - -
    -
    -
    -
    - ' . $page['tagline'] . ''; ?> -
    -
    -
    -
    - '; ?> -
    -
    -
    -
    - -
    -
    -
    -
    - View On GitHub'; - foreach ($entry_page as $key => $node) echo '' . $key . ''; - ?> -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - - - - - - Fork me on GitHub - -
    - -
    -
    - -
    - -
    - -
    -
    -
    -
    - - - - - - - - -
    -

    You are editing  Close

    - - -
    -
    - -
    -
    -
    -
    -
    - - - - - - - - - - - '; - ?> - - - - - - - '; ?> - - - '; ?> - - - - - - - diff --git a/templates/default/error.php b/templates/default/error.php deleted file mode 100644 index 1cbd59b..0000000 --- a/templates/default/error.php +++ /dev/null @@ -1,150 +0,0 @@ -'; - $nav .= $this->build_navigation($tree, $path, $base_page); - $nav .= ''; - return $nav; - } - - private function build_navigation($tree, $path, $base_page) { - $nav = ''; - foreach ($tree->value as $url => $node) { - if ($node instanceof \Todaymade\Daux\Tree\Content) { - if ($node->value === 'index') continue; - $link = ($path === '') ? $url : $path . '/' . $url; - $nav .= '
  • ' . $node->title . '
  • '; - } - if ($node instanceof \Todaymade\Daux\Tree\Directory) { - $nav .= '
  • '; - $link = ($path === '') ? $url : $path . '/' . $url; - if ($node->index_page) $nav .= '' . $node->title . ''; - else $nav .= '' . $node->title . ''; - $nav .= '
  • '; - } - } - return $nav; - } - - public function get_content($page, $params) { - $base_url = $params['base_url']; - $base_page = $params['base_page']; - $project_title = utf8_encode($params['title']); - $index = utf8_encode($base_page . $params['index']->value); - $tree = $params['tree']; - ob_start(); -?> - - - - - - - <?php echo $page['title']; ?> - - - - - - - - "; ?> - - - "; ?> - - - - - Fork me on GitHub - -
    - -
    -
    - -
    - -
    - -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    - - - - - - - - - - '; - ?> - - - '; ?> - - - - - - - - diff --git a/templates/error.php b/templates/error.php new file mode 100644 index 0000000..67d16a4 --- /dev/null +++ b/templates/error.php @@ -0,0 +1,9 @@ +layout('theme::layout/05_page') ?> + +
    + + + +
    diff --git a/templates/home.php b/templates/home.php new file mode 100644 index 0000000..0d2b5aa --- /dev/null +++ b/templates/home.php @@ -0,0 +1,77 @@ +layout('theme::layout/00_layout') ?> + + + Fork me on GitHub + + +
    +
    +
    +
    + ' . $params['tagline'] . ''; ?> +
    +
    +
    +
    + '; ?> +
    +
    +
    +
    + +
    +
    +
    +
    + View On GitHub'; + foreach ($page['entry_page'] as $key => $node) echo '' . $key . ''; + ?> +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + diff --git a/templates/layout/00_layout.php b/templates/layout/00_layout.php new file mode 100644 index 0000000..f0eea18 --- /dev/null +++ b/templates/layout/00_layout.php @@ -0,0 +1,56 @@ + + + + + + + <?php echo $page['title']; ?> + + + + + + + + + + "; ?> + + + "; ?> + + + + + + + section('content'); ?> + + insert('partials/google_analytics', ['analytics' => $params['google_analytics'], 'host' => array_key_exists('host', $params)? $params['host'] : '']); + } ?> + insert('partials/piwik_analytics', ['url' => $params['piwik_analytics'], 'id' => $params['piwik_analytics_id']]); + } ?> + + + + '; + if ($params['theme']['bootstrap-js']) echo ''; + ?> + + + + + + + '; ?> + + + '; ?> + + + diff --git a/templates/layout/05_page.php b/templates/layout/05_page.php new file mode 100644 index 0000000..d5244bc --- /dev/null +++ b/templates/layout/05_page.php @@ -0,0 +1,53 @@ +layout('theme::layout/00_layout') ?> + + + Fork me on GitHub + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + section('content'); ?> +
    +
    +
    +
    diff --git a/templates/partials/google_analytics.php b/templates/partials/google_analytics.php new file mode 100644 index 0000000..2f6328b --- /dev/null +++ b/templates/partials/google_analytics.php @@ -0,0 +1,9 @@ + diff --git a/templates/partials/piwik_analytics.php b/templates/partials/piwik_analytics.php new file mode 100644 index 0000000..32ddcac --- /dev/null +++ b/templates/partials/piwik_analytics.php @@ -0,0 +1,15 @@ + + diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 0b3843c..27c0cb8 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -7,4 +7,5 @@ $baseDir = dirname($vendorDir); return array( 'Todaymade\\Daux\\' => array($baseDir . '/libs'), + 'League\\Plates\\' => array($vendorDir . '/league/plates/src'), ); diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 6a4b553..038a10c 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -39,5 +39,59 @@ "markdown", "parser" ] + }, + { + "name": "league/plates", + "version": "3.1.0", + "version_normalized": "3.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/plates.git", + "reference": "c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/plates/zipball/c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8", + "reference": "c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8", + "shasum": "" + }, + "require-dev": { + "mikey179/vfsstream": "~1.4.0", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "time": "2014-10-21 12:06:12", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\Plates\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "role": "Developer" + } + ], + "description": "Plates, the native PHP template system that's fast, easy to use and easy to extend.", + "homepage": "http://platesphp.com", + "keywords": [ + "league", + "package", + "templates", + "templating", + "views" + ] } ] From 6edd4ce4778aa6ef577ddf6a62b9a6647e3ecf5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Thu, 23 Apr 2015 15:47:05 +0200 Subject: [PATCH 008/127] Fix static reference to theme in generated documentation --- libs/Daux.php | 5 +++-- libs/Generator/Generator.php | 19 ++++++++++++++++--- libs/MarkdownPage.php | 7 ++++--- templates/layout/05_page.php | 3 ++- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/libs/Daux.php b/libs/Daux.php index a2a58de..cc2a02c 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -116,6 +116,7 @@ class Daux 'multilanguage' => !empty($this->options['languages']), //Paths and tree + 'theme-name' => $this->options['theme'], 'mode' => $this->mode, 'local_base' => $this->local_base, 'docs_path' => $this->docs_path, @@ -151,10 +152,10 @@ class Daux } $params['theme'] = DauxHelper::getTheme( - $this->local_base . DS . 'resources' . DS . 'themes' . DS . $this->options['theme'], + $this->local_base . DS . 'resources' . DS . 'themes' . DS . $this->options['theme-name'], $params['base_url'], $this->local_base, - $params['base_url'] . "resources/themes/" . $this->options['theme'] . '/' + $params['base_url'] . "resources/themes/" . $this->options['theme-name'] . '/' ); return $params; diff --git a/libs/Generator/Generator.php b/libs/Generator/Generator.php index a7af7eb..1b3d390 100644 --- a/libs/Generator/Generator.php +++ b/libs/Generator/Generator.php @@ -1,6 +1,7 @@ local_base . DS . 'static'; } + echo "Copying Static assets ...\n"; Helper::copyAssets($destination, $daux->local_base); + echo "Generating ...\n"; $this->generateRecursive($daux->tree, $destination, $params); + echo "Done !\n"; } private function generateRecursive($tree, $output_dir, $params, $base_url = '') { $params['base_url'] = $params['base_page'] = $base_url; - $new_params = $params; - // + + // Rebase Theme + $params['theme'] = DauxHelper::getTheme( + $params['local_base'] . DS . 'resources' . DS . 'themes' . DS . $params['theme-name'], + $base_url, + $params['local_base'], + $params['base_url'] . "resources/themes/" . $params['theme-name'] . '/' + ); + $params['image'] = str_replace('', $base_url, $params['image']); if ($base_url !== '') { $params['entry_page'] = $tree->getFirstPage(); @@ -35,14 +46,16 @@ class Generator if ($node instanceof Directory) { $new_output_dir = $output_dir . DS . $key; @mkdir($new_output_dir); - $this->generateRecursive($node, $new_output_dir, $new_params, '../' . $base_url); + $this->generateRecursive($node, $new_output_dir, $params, '../' . $base_url); } elseif ($node instanceof Content) { + echo "- " . $node->getUrl() . "\n"; $params['request'] = $node->getUrl(); $params['file_uri'] = $node->getName(); $page = MarkdownPage::fromFile($node, $params); file_put_contents($output_dir . DS . $key, $page->getContent()); } else { + echo "- " . $node->getUrl() . "\n"; copy($node->getPath(), $output_dir . DS . $key); } } diff --git a/libs/MarkdownPage.php b/libs/MarkdownPage.php index 5897d5e..16da76d 100644 --- a/libs/MarkdownPage.php +++ b/libs/MarkdownPage.php @@ -28,19 +28,19 @@ class MarkdownPage extends SimplePage $this->params = $params; $this->title = $file->title; + $this->homepage = false; if ($this->title === 'index') { - $this->homepage = ($this->file->getName() === '_index'); $minimum_parent_dir_size = ($params['multilanguage']) ? 2 : 1; if (count($file->getParents()) >= $minimum_parent_dir_size) { $parents = $file->getParents(); $parent = end($parents); $this->title = $parent->getTitle(); } else { + $this->homepage = ($this->file->getName() === '_index'); $this->title = $params['title']; } - } else { - $this->homepage = false; } + if ($params['breadcrumbs']) { $this->breadcrumb_trail = $this->buildBreadcrumbTrail($file->getParents(), $params['multilanguage']); } @@ -105,6 +105,7 @@ class MarkdownPage extends SimplePage $page['path'] = $this->file->getPath(); $page['modified_time'] = filemtime($this->file->getPath()); $page['markdown'] = $this->content; + $page['request'] = $params['request']; $Parsedown = new \Parsedown(); $page['content'] = $Parsedown->text($this->content); diff --git a/templates/layout/05_page.php b/templates/layout/05_page.php index d5244bc..c69d5d9 100644 --- a/templates/layout/05_page.php +++ b/templates/layout/05_page.php @@ -26,7 +26,8 @@ if ($page['language'] !== '') echo $this->get_navigation($tree->value[$page['language']], $page['language'], $params['request'], $base_page, $params['mode']); else echo $this->get_navigation($tree, '', $params['request'], $base_page, $params['mode']); ?> - + +
    From d817875755b37493e381a7d652014ed4a4677d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Thu, 23 Apr 2015 20:42:44 +0200 Subject: [PATCH 009/127] Simplify template --- libs/Template.php | 72 ++++++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/libs/Template.php b/libs/Template.php index 3bb7c59..de22fdd 100644 --- a/libs/Template.php +++ b/libs/Template.php @@ -21,17 +21,13 @@ class Template public function render($name, array $data = array()) { - $this->engine->addData([ 'index' => utf8_encode($data['params']['base_page'] . $data['params']['index']->value), 'base_url' => $data['params']['base_url'], 'base_page' => $data['params']['base_page'], 'page' => $data['page'], 'params' => $data['params'], - //'homepage' => $data['params']['homepage'], - //'project_title' => utf8_encode($data['params']['title']), 'tree' => $data['params']['tree'], - //'entry_page' => $data['page']['entry_page'], ]); return $this->engine->render($name, $data); @@ -40,10 +36,8 @@ class Template protected function registerFunctions() { $this->engine->registerFunction('get_navigation', function($tree, $path, $current_url, $base_page, $mode) { - $nav = ''; - return $nav; + $nav = $this->buildNavigation($tree, $path, $current_url, $base_page, $mode); + return $this->renderNavigation($nav); }); $this->engine->registerFunction('get_breadcrumb_title', function($page, $base_page) { @@ -64,42 +58,68 @@ class Template }); } + private function renderNavigation($entries) + { + $nav = ""; + foreach ($entries as $entry) { + + if (array_key_exists('children', $entry)) { + if (array_key_exists('href', $entry)) { + $link = '' . $entry['title'] . ''; + } else { + $link = '' . $entry['title'] . ''; + } + + $link .= $this->renderNavigation($entry['children']); + } else { + $link = '' . $entry['title'] . ''; + } + + $nav .= "
  • $link
  • "; + } + + return ""; + } + private function buildNavigation($tree, $path, $current_url, $base_page, $mode) { - $nav = ''; + $nav = []; foreach ($tree->value as $node) { $url = $node->getUri(); if ($node instanceof \Todaymade\Daux\Tree\Content) { if ($node->value === 'index') { continue; } - $nav .= '' . $node->getTitle() . ''; + + $nav[] = [ + 'title' => $node->getTitle(), + 'href' => $base_page . $link, + 'class' => ($current_url === $link)? 'active' : '' + ]; } if ($node instanceof \Todaymade\Daux\Tree\Directory) { - $nav .= ' $node->getTitle(), + 'class' => (strpos($current_url, $link) === 0)? 'open' : '', + ]; + if ($mode === \TodayMade\Daux\Daux::STATIC_MODE) { $link .= "/index.html"; } + if ($node->getIndexPage()) { - $nav .= '' . - $node->getTitle() . ''; - } else { - $nav .= '' . $node->getTitle() . ''; + $folder['href'] = $base_page . $link; } - $nav .= ''; + $folder['children'] = $this->buildNavigation($node, $new_path, $current_url, $base_page, $mode); + + $nav[] = $folder; } } return $nav; From f3d472363d01c12b197ee3e770bc0817c1b22231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Thu, 23 Apr 2015 21:04:00 +0200 Subject: [PATCH 010/127] Cleanup --- libs/Daux.php | 4 ++-- libs/DauxHelper.php | 9 +++++---- libs/Generator/Generator.php | 6 +++--- libs/Server/Helper.php | 38 ------------------------------------ libs/Server/Server.php | 36 +++++++++++++++++++++++++++++++++- libs/Tree/Builder.php | 4 +--- libs/Tree/Content.php | 3 +-- 7 files changed, 47 insertions(+), 53 deletions(-) delete mode 100644 libs/Server/Helper.php diff --git a/libs/Daux.php b/libs/Daux.php index cc2a02c..f6c8a1a 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -152,10 +152,10 @@ class Daux } $params['theme'] = DauxHelper::getTheme( - $this->local_base . DS . 'resources' . DS . 'themes' . DS . $this->options['theme-name'], + $this->options['theme-name'], $params['base_url'], $this->local_base, - $params['base_url'] . "resources/themes/" . $this->options['theme-name'] . '/' + $params['base_url'] ); return $params; diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index aeedb30..e4dc87e 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -26,9 +26,10 @@ class DauxHelper return $request; } - public static function getTheme($theme_folder, $base_url, $local_base, $theme_url) + public static function getTheme($theme_name, $base_url, $local_base, $current_url) { - $name = static::pathinfo($theme_folder); + $theme_folder = $local_base . DS . 'resources' . DS . 'themes' . DS . $theme_name; + $theme_url = $base_url . "resources/themes/" . $theme_name . '/'; $theme = array(); if (is_file($theme_folder . DS . "config.json")) { @@ -37,10 +38,10 @@ class DauxHelper $theme = array(); } } - $theme['name'] = $name['filename']; //Default parameters for theme $theme += [ + 'name' => $theme_name, 'css' => [], 'js' => [], 'fonts' => [], @@ -50,7 +51,7 @@ class DauxHelper 'templates' => $theme_folder . DS . 'templates', ]; - $substitutions = ['' => $local_base, '' => $base_url, '' => $theme_url]; + $substitutions = ['' => $local_base, '' => $current_url, '' => $theme_url]; // Substitute some placeholders $theme['templates'] = strtr($theme['templates'], $substitutions); diff --git a/libs/Generator/Generator.php b/libs/Generator/Generator.php index 1b3d390..0952dd0 100644 --- a/libs/Generator/Generator.php +++ b/libs/Generator/Generator.php @@ -32,10 +32,10 @@ class Generator // Rebase Theme $params['theme'] = DauxHelper::getTheme( - $params['local_base'] . DS . 'resources' . DS . 'themes' . DS . $params['theme-name'], - $base_url, + $params['theme-name'], + $params['base_url'], $params['local_base'], - $params['base_url'] . "resources/themes/" . $params['theme-name'] . '/' + $base_url ); $params['image'] = str_replace('', $base_url, $params['image']); diff --git a/libs/Server/Helper.php b/libs/Server/Helper.php deleted file mode 100644 index 711689d..0000000 --- a/libs/Server/Helper.php +++ /dev/null @@ -1,38 +0,0 @@ -params = $this->daux->getParams(); - $request = Helper::getRequest(); + $request = $this->getRequest(); $request = urldecode($request); $request_type = isset($query['method']) ? $query['method'] : ''; if ($request == 'first_page') { @@ -128,4 +128,38 @@ class Server } return MarkdownPage::fromFile($file, $params); } + + public function getRequest() + { + if (isset($_SERVER['PATH_INFO'])) { + $uri = $_SERVER['PATH_INFO']; + } elseif (isset($_SERVER['REQUEST_URI'])) { + $uri = $_SERVER['REQUEST_URI']; + if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) { + $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); + } elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) { + $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); + } + if (strncmp($uri, '?/', 2) === 0) { + $uri = substr($uri, 2); + } + $parts = preg_split('#\?#i', $uri, 2); + $uri = $parts[0]; + if (isset($parts[1])) { + $_SERVER['QUERY_STRING'] = $parts[1]; + parse_str($_SERVER['QUERY_STRING'], $_GET); + } else { + $_SERVER['QUERY_STRING'] = ''; + $_GET = array(); + } + $uri = parse_url($uri, PHP_URL_PATH); + } else { + return false; + } + $uri = str_replace(array('//', '../'), '/', trim($uri, '/')); + if ($uri == "") { + $uri = "first_page"; + } + return $uri; + } } diff --git a/libs/Tree/Builder.php b/libs/Tree/Builder.php index c5258c4..b538846 100644 --- a/libs/Tree/Builder.php +++ b/libs/Tree/Builder.php @@ -34,12 +34,10 @@ class Builder continue; } - $file_details = DauxHelper::pathinfo($path); - $entry = null; if (is_dir($path)) { $entry = static::build($path, $ignore, $params, $new_parents); - } elseif (in_array($file_details['extension'], Daux::$VALID_MARKDOWN_EXTENSIONS)) { + } elseif (in_array(pathinfo($path, PATHINFO_EXTENSION), Daux::$VALID_MARKDOWN_EXTENSIONS)) { $entry = new Content($path, $new_parents); if ($params['mode'] === Daux::STATIC_MODE) { diff --git a/libs/Tree/Content.php b/libs/Tree/Content.php index 7941e3b..466adf9 100644 --- a/libs/Tree/Content.php +++ b/libs/Tree/Content.php @@ -15,7 +15,6 @@ class Content extends Entry protected function getFilename($file) { - $file = DauxHelper::pathinfo($file); - return $file['filename']; + return DauxHelper::pathinfo($file)['filename']; } } From b6c8b567fc4d42e8339f198d3203d226a81b3bcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sun, 26 Apr 2015 18:24:22 +0200 Subject: [PATCH 011/127] Fix homepage getter --- libs/MarkdownPage.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/MarkdownPage.php b/libs/MarkdownPage.php index 16da76d..b952572 100644 --- a/libs/MarkdownPage.php +++ b/libs/MarkdownPage.php @@ -40,7 +40,7 @@ class MarkdownPage extends SimplePage $this->title = $params['title']; } } - + if ($params['breadcrumbs']) { $this->breadcrumb_trail = $this->buildBreadcrumbTrail($file->getParents(), $params['multilanguage']); } @@ -87,7 +87,7 @@ class MarkdownPage extends SimplePage $entry_page[$name] = $params['base_page'] . $params['entry_page'][$key]->getUrl(); } } else { - $entry_page['View Documentation'] = $params['base_page'] . $params['entry_page']->getUri(); + $entry_page['View Documentation'] = $params['base_page'] . $params['entry_page']->getUrl(); } } elseif ($params['file_uri'] === 'index') { $entry_page[$params['entry_page']->title] = $params['base_page'] . $params['entry_page']->getUrl(); From 976db8925d6642f8a0e5fed9f486269d78cb3d5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Mon, 27 Apr 2015 11:57:31 +0200 Subject: [PATCH 012/127] Fix header homepage in generated mode --- libs/Template.php | 1 - templates/home.php | 3 +-- templates/layout/05_page.php | 3 +-- templates/partials/navbar_content.php | 2 ++ 4 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 templates/partials/navbar_content.php diff --git a/libs/Template.php b/libs/Template.php index de22fdd..387dd91 100644 --- a/libs/Template.php +++ b/libs/Template.php @@ -22,7 +22,6 @@ class Template public function render($name, array $data = array()) { $this->engine->addData([ - 'index' => utf8_encode($data['params']['base_page'] . $data['params']['index']->value), 'base_url' => $data['params']['base_url'], 'base_page' => $data['params']['base_page'], 'page' => $data['page'], diff --git a/templates/home.php b/templates/home.php index 0d2b5aa..a5ee3cf 100644 --- a/templates/home.php +++ b/templates/home.php @@ -1,8 +1,7 @@ layout('theme::layout/00_layout') ?> diff --git a/templates/layout/05_page.php b/templates/layout/05_page.php index c69d5d9..cc9c02e 100644 --- a/templates/layout/05_page.php +++ b/templates/layout/05_page.php @@ -6,8 +6,7 @@
    diff --git a/templates/partials/navbar_content.php b/templates/partials/navbar_content.php new file mode 100644 index 0000000..7932a42 --- /dev/null +++ b/templates/partials/navbar_content.php @@ -0,0 +1,2 @@ + + From 36c663ac41919450a87d731a8245211cb56d05bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Mon, 27 Apr 2015 11:57:44 +0200 Subject: [PATCH 013/127] Various cleanups --- docs/config.json | 1 - libs/DauxHelper.php | 24 ------------------- libs/MarkdownPage.php | 43 ++++++++++++++++------------------ libs/Template.php | 4 +--- templates/layout/00_layout.php | 2 -- 5 files changed, 21 insertions(+), 53 deletions(-) diff --git a/docs/config.json b/docs/config.json index e84ad5b..a2dfbef 100644 --- a/docs/config.json +++ b/docs/config.json @@ -4,7 +4,6 @@ "author": "Justin Walsh", "image": "app.png", "theme": "daux-blue", - "template": "default", "clean_urls": true, "toggle_code": true, "breadcrumbs": true, diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index e4dc87e..0abde93 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -2,30 +2,6 @@ class DauxHelper { - - public static function getBreadcrumbFromRequest($request, $separator = 'Chevrons', $multilanguage = false) - { - if ($multilanguage) { - $request = substr($request, strpos($request, '/') + 1); - } - $request = str_replace('_', ' ', $request); - switch ($separator) { - case 'Chevrons': - $request = str_replace('/', ' ', $request); - return $request; - case 'Colons': - $request = str_replace('/', ': ', $request); - return $request; - case 'Spaces': - $request = str_replace('/', ' ', $request); - return $request; - default: - $request = str_replace('/', $separator, $request); - return $request; - } - return $request; - } - public static function getTheme($theme_name, $base_url, $local_base, $current_url) { $theme_folder = $local_base . DS . 'resources' . DS . 'themes' . DS . $theme_name; diff --git a/libs/MarkdownPage.php b/libs/MarkdownPage.php index b952572..6cb4d46 100644 --- a/libs/MarkdownPage.php +++ b/libs/MarkdownPage.php @@ -8,7 +8,6 @@ class MarkdownPage extends SimplePage private $params; private $language; private $homepage; - private $breadcrumb_trail; public function __construct() { @@ -28,22 +27,18 @@ class MarkdownPage extends SimplePage $this->params = $params; $this->title = $file->title; - $this->homepage = false; + $this->homepage = false; if ($this->title === 'index') { $minimum_parent_dir_size = ($params['multilanguage']) ? 2 : 1; if (count($file->getParents()) >= $minimum_parent_dir_size) { $parents = $file->getParents(); - $parent = end($parents); - $this->title = $parent->getTitle(); + $this->title = end($parents)->getTitle(); } else { - $this->homepage = ($this->file->getName() === '_index'); + $this->homepage = ($this->file->getName() === '_index'); $this->title = $params['title']; } } - if ($params['breadcrumbs']) { - $this->breadcrumb_trail = $this->buildBreadcrumbTrail($file->getParents(), $params['multilanguage']); - } $this->language = ''; if ($params['multilanguage'] && count($file->getParents())) { reset($file->getParents()); @@ -52,7 +47,7 @@ class MarkdownPage extends SimplePage } } - private function buildBreadcrumbTrail($parents, $multilanguage) + private function getBreadcrumbTrail($parents, $multilanguage) { if ($multilanguage && !empty($parents)) { $parents = array_splice($parents, 1); @@ -93,22 +88,24 @@ class MarkdownPage extends SimplePage $entry_page[$params['entry_page']->title] = $params['base_page'] . $params['entry_page']->getUrl(); } - $page['entry_page'] = $entry_page; - $page['homepage'] = $this->homepage; - $page['title'] = $this->file->getTitle(); - $page['filename'] = $this->file->getName(); - if ($page['breadcrumbs'] = $params['breadcrumbs']) { - $page['breadcrumb_trail'] = $this->breadcrumb_trail; + $page = [ + 'entry_page' => $entry_page, + 'homepage' => $this->homepage, + 'title' => $this->file->getTitle(), + 'filename' => $this->file->getName(), + 'language' => $this->language, + 'path' => $this->file->getPath(), + 'modified_time' => filemtime($this->file->getPath()), + 'markdown' => $this->content, + 'request' => $params['request'], + 'content' => (new \Parsedown())->text($this->content), + 'breadcrumbs' => $params['breadcrumbs'] + ]; + + if ($page['breadcrumbs']) { + $page['breadcrumb_trail'] = $this->getBreadcrumbTrail($this->file->getParents(), $params['multilanguage']); $page['breadcrumb_separator'] = $params['breadcrumb_separator']; } - $page['language'] = $this->language; - $page['path'] = $this->file->getPath(); - $page['modified_time'] = filemtime($this->file->getPath()); - $page['markdown'] = $this->content; - $page['request'] = $params['request']; - - $Parsedown = new \Parsedown(); - $page['content'] = $Parsedown->text($this->content); $template = new Template($params['templates'], $params['theme']['templates']); return $template->render($this->homepage? 'home' : 'content', ['page' => $page, 'params' => $params]); diff --git a/libs/Template.php b/libs/Template.php index 387dd91..1ee61f6 100644 --- a/libs/Template.php +++ b/libs/Template.php @@ -4,7 +4,6 @@ use League\Plates\Engine; class Template { - protected $engine; public function __construct($base, $theme) @@ -61,7 +60,6 @@ class Template { $nav = ""; foreach ($entries as $entry) { - if (array_key_exists('children', $entry)) { if (array_key_exists('href', $entry)) { $link = '' . $entry['title'] . ''; @@ -106,7 +104,7 @@ class Template 'class' => (strpos($current_url, $link) === 0)? 'open' : '', ]; - if ($mode === \TodayMade\Daux\Daux::STATIC_MODE) { + if ($mode === Daux::STATIC_MODE) { $link .= "/index.html"; } diff --git a/templates/layout/00_layout.php b/templates/layout/00_layout.php index f0eea18..cf4d418 100644 --- a/templates/layout/00_layout.php +++ b/templates/layout/00_layout.php @@ -24,8 +24,6 @@ - - section('content'); ?> Date: Mon, 27 Apr 2015 12:47:10 +0200 Subject: [PATCH 014/127] Fix server, now returns files that are in the `docs` folder --- index.php | 12 ++++++ libs/Daux.php | 4 ++ libs/RawPage.php | 32 ++++++++++++++++ libs/Server/MimeType.php | 81 ++++++++++++++++++++++++++++++++++++++++ libs/Server/Server.php | 16 ++++++-- libs/Tree/Entry.php | 23 +++++++----- 6 files changed, 155 insertions(+), 13 deletions(-) create mode 100644 libs/RawPage.php create mode 100644 libs/Server/MimeType.php diff --git a/index.php b/index.php index 6ad4a24..be271a3 100644 --- a/index.php +++ b/index.php @@ -63,6 +63,18 @@ software, even if advised of the possibility of such damage. */ +if (php_sapi_name() === 'cli-server') { + // This file allows us to emulate Apache's "mod_rewrite" + // functionality from the built-in PHP web server. + $uri = urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); + if ($uri !== '/' && file_exists(__DIR__ . $uri)) { + return false; + } + // When the built in server is used + // the script name is the file called + $_SERVER['SCRIPT_NAME'] = '/index.php'; +} + require_once("vendor/autoload.php"); \Todaymade\Daux\Daux::initConstants(); diff --git a/libs/Daux.php b/libs/Daux.php index f6c8a1a..cbb2ddc 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -12,6 +12,10 @@ class Daux public $base_url = ''; public $host; private $docs_path; + + /** + * @var Tree\Entry + */ public $tree; public $options; private $mode; diff --git a/libs/RawPage.php b/libs/RawPage.php new file mode 100644 index 0000000..6f76752 --- /dev/null +++ b/libs/RawPage.php @@ -0,0 +1,32 @@ +file = $filename; + } + + public function getContent() + { + throw new Exception("you should not use this method to show a raw content"); + } + + public function display() + { + header('Content-type: ' . MimeType::get($this->file)); + + // Transfer file in 1024 byte chunks to save memory usage. + if ($fd = fopen($this->file, 'rb')) { + while (!feof($fd)) { + print fread($fd, 1024); + } + fclose($fd); + } + } +} diff --git a/libs/Server/MimeType.php b/libs/Server/MimeType.php new file mode 100644 index 0000000..3e02512 --- /dev/null +++ b/libs/Server/MimeType.php @@ -0,0 +1,81 @@ + + * @see http://www.php.net/mime_content_type + */ +class MimeType +{ + /** + * @var array + */ + protected static $mimeTypes = array( + 'txt' => 'text/plain', + 'htm' => 'text/html', + 'html' => 'text/html', + 'php' => 'text/html', + 'css' => 'text/css', + 'js' => 'application/javascript', + 'json' => 'application/json', + 'xml' => 'application/xml', + 'swf' => 'application/x-shockwave-flash', + 'flv' => 'video/x-flv', + // Images + 'png' => 'image/png', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'gif' => 'image/gif', + 'bmp' => 'image/bmp', + 'ico' => 'image/vnd.microsoft.icon', + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + // Archives + 'zip' => 'application/zip', + 'rar' => 'application/x-rar-compressed', + 'exe' => 'application/x-msdownload', + 'msi' => 'application/x-msdownload', + 'cab' => 'application/vnd.ms-cab-compressed', + // Audio/video + 'mp3' => 'audio/mpeg', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + // Adobe + 'pdf' => 'application/pdf', + 'psd' => 'image/vnd.adobe.photoshop', + 'ai' => 'application/postscript', + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + // MS Office + 'doc' => 'application/msword', + 'rtf' => 'application/rtf', + 'xls' => 'application/vnd.ms-excel', + 'ppt' => 'application/vnd.ms-powerpoint', + // Open Office + 'odt' => 'application/vnd.oasis.opendocument.text', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + ); + /** + * @param $filename + * @return string + */ + public static function get($filename) + { + $pathInfo = pathinfo($filename); + $extension = strtolower($pathInfo['extension']); + if (array_key_exists($extension, self::$mimeTypes)) { + return self::$mimeTypes[$extension]; + } elseif (function_exists('finfo_open') && is_file($filename)) { + $finfo = finfo_open(FILEINFO_MIME); + $mimetype = finfo_file($finfo, $filename); + finfo_close($finfo); + return $mimetype; + } else { + return 'application/octet-stream'; + } + } +} diff --git a/libs/Server/Server.php b/libs/Server/Server.php index 32ada13..4565092 100644 --- a/libs/Server/Server.php +++ b/libs/Server/Server.php @@ -3,8 +3,10 @@ use Todaymade\Daux\Daux; use Todaymade\Daux\Exception; use Todaymade\Daux\MarkdownPage; +use Todaymade\Daux\RawPage; use Todaymade\Daux\SimplePage; use Todaymade\Daux\Tree\Directory; +use Todaymade\Daux\Tree\Raw; class Server { @@ -41,8 +43,9 @@ class Server $request = urldecode($request); $request_type = isset($query['method']) ? $query['method'] : ''; if ($request == 'first_page') { - $request = $this->daux->tree->first_page->uri; + $request = $this->daux->tree->getFirstPage()->getUri(); } + switch ($request_type) { case 'DauxEdit': if (!$this->daux->options['file_editor']) { @@ -115,16 +118,21 @@ class Server private function getPage($request) { - $params = $this->params; - $file = $this->getFile($request); if ($file === false) { throw new NotFoundException('The Page you requested is yet to be made. Try again later.'); } + + if ($file instanceof Raw) { + return new RawPage($file->getPath()); + } + + $params = $this->params; + $params['request'] = $request; $params['file_uri'] = $file->value; if ($request !== 'index') { - $params['entry_page'] = $file->first_page; + $params['entry_page'] = $file->getFirstPage(); } return MarkdownPage::fromFile($file, $params); } diff --git a/libs/Tree/Entry.php b/libs/Tree/Entry.php index aca1722..d0767ad 100644 --- a/libs/Tree/Entry.php +++ b/libs/Tree/Entry.php @@ -61,22 +61,27 @@ abstract class Entry $this->index_page = $index_page; } + /** + * @return Entry + */ public function getFirstPage() { if ($this->first_page) { return $this->first_page; } - foreach ($this->value as $node) { - if ($node instanceof Content && $node->title != 'index') { - $this->first_page = $node; - return $node; + if ($this instanceof Directory) { + foreach ($this->value as $node) { + if ($node instanceof Content && $node->title != 'index') { + $this->first_page = $node; + return $node; + } } - } - foreach ($this->value as $node) { - if ($node instanceof Directory && $page = $node->getFirstPage()) { - $this->first_page = $page; - return $page; + foreach ($this->value as $node) { + if ($node instanceof Directory && $page = $node->getFirstPage()) { + $this->first_page = $page; + return $page; + } } } return false; From d01374dddb00568a4ff095470f5e5954f9b214c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Mon, 27 Apr 2015 16:47:14 +0200 Subject: [PATCH 015/127] Fix first page calculation --- libs/Tree/Entry.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/Tree/Entry.php b/libs/Tree/Entry.php index d0767ad..32575ee 100644 --- a/libs/Tree/Entry.php +++ b/libs/Tree/Entry.php @@ -72,7 +72,12 @@ abstract class Entry if ($this instanceof Directory) { foreach ($this->value as $node) { - if ($node instanceof Content && $node->title != 'index') { + if ($node instanceof Content) { + if (!count($node->getParents()) && $node->title == 'index') { + //the homepage should not count as first page + continue; + } + $this->first_page = $node; return $node; } From 520f268bd021892dbf2abc6d6a6d3c6803c6fbfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Mon, 27 Apr 2015 23:17:44 +0200 Subject: [PATCH 016/127] Update documentation --- docs/00_Getting_Started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/00_Getting_Started.md b/docs/00_Getting_Started.md index fef7fad..8de6561 100644 --- a/docs/00_Getting_Started.md +++ b/docs/00_Getting_Started.md @@ -123,7 +123,7 @@ We have 4 built-in Bootstrap themes. To use one of the themes, just set the `the ``` ###Custom Theme: -To use a custom theme, just copy over the theme folder as well as the `.thm` file for that theme into the `themes` directory and set its value in the `theme` param in config.json +To use a custom theme, just copy over the theme folder into the `themes` directory and set its value in the `theme` param in config.json ```json { From cc4ba14dc2795eca46907253f5f9ef145d834ac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Mon, 27 Apr 2015 23:18:00 +0200 Subject: [PATCH 017/127] Configure templates for extension --- templates/home.php | 2 +- templates/layout/00_layout.php | 4 ++-- templates/layout/05_page.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/home.php b/templates/home.php index a5ee3cf..d0bb6f4 100644 --- a/templates/home.php +++ b/templates/home.php @@ -1,7 +1,7 @@ layout('theme::layout/00_layout') ?> diff --git a/templates/layout/00_layout.php b/templates/layout/00_layout.php index cf4d418..19abf8f 100644 --- a/templates/layout/00_layout.php +++ b/templates/layout/00_layout.php @@ -27,10 +27,10 @@ section('content'); ?> insert('partials/google_analytics', ['analytics' => $params['google_analytics'], 'host' => array_key_exists('host', $params)? $params['host'] : '']); + $this->insert('theme::partials/google_analytics', ['analytics' => $params['google_analytics'], 'host' => array_key_exists('host', $params)? $params['host'] : '']); } ?> insert('partials/piwik_analytics', ['url' => $params['piwik_analytics'], 'id' => $params['piwik_analytics_id']]); + $this->insert('theme::partials/piwik_analytics', ['url' => $params['piwik_analytics'], 'id' => $params['piwik_analytics_id']]); } ?> diff --git a/templates/layout/05_page.php b/templates/layout/05_page.php index cc9c02e..9703764 100644 --- a/templates/layout/05_page.php +++ b/templates/layout/05_page.php @@ -6,7 +6,7 @@
    From 90dbdb4f0bc362df0d0c56d0c97b69c411caf384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Mon, 18 May 2015 14:26:29 +0200 Subject: [PATCH 018/127] Create a notion of Export format, prepare for multiple generation systems --- libs/Daux.php | 45 +++-------- libs/DauxHelper.php | 42 ++++++++++ libs/Format/Base/MarkdownPage.php | 45 +++++++++++ libs/Format/Base/Page.php | 6 ++ libs/Format/Base/RawPage.php | 23 ++++++ libs/Format/Base/SimplePage.php | 33 ++++++++ libs/{ => Format/HTML}/MarkdownPage.php | 53 +++---------- libs/Format/HTML/RawPage.php | 6 ++ libs/Format/HTML/SimplePage.php | 5 ++ libs/{ => Format/HTML}/Template.php | 3 +- libs/Generator/Generator.php | 2 +- libs/Generator/Helper.php | 1 - libs/Page.php | 7 -- libs/RawPage.php | 32 -------- libs/Server/ErrorPage.php | 21 +---- libs/Server/Server.php | 101 +++++++++++++----------- libs/SimplePage.php | 39 --------- libs/Tree/Builder.php | 1 - libs/Tree/Entry.php | 10 +-- 19 files changed, 246 insertions(+), 229 deletions(-) create mode 100644 libs/Format/Base/MarkdownPage.php create mode 100644 libs/Format/Base/Page.php create mode 100644 libs/Format/Base/RawPage.php create mode 100644 libs/Format/Base/SimplePage.php rename libs/{ => Format/HTML}/MarkdownPage.php (67%) create mode 100644 libs/Format/HTML/RawPage.php create mode 100644 libs/Format/HTML/SimplePage.php rename libs/{ => Format/HTML}/Template.php (98%) delete mode 100644 libs/Page.php delete mode 100644 libs/RawPage.php delete mode 100644 libs/SimplePage.php diff --git a/libs/Daux.php b/libs/Daux.php index cbb2ddc..36ffd30 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -1,6 +1,6 @@ mode = $mode; $this->local_base = dirname(__DIR__); - $this->base_url = ''; - - if ($this->mode == Daux::LIVE_MODE) { - $this->host = $_SERVER['HTTP_HOST']; - $this->base_url = $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']); - $t = strrpos($this->base_url, '/index.php'); - if ($t != false) { - $this->base_url = substr($this->base_url, 0, $t); - } - if (substr($this->base_url, -1) !== '/') { - $this->base_url .= '/'; - } - } } public static function initConstants() @@ -45,10 +30,10 @@ class Daux define("DS", DIRECTORY_SEPARATOR); } - public function initialize($global_config_file = null, $config_file = 'config.json') + public function initialize($global_config_file = null, $override_file = 'config.json') { $this->loadConfig($global_config_file); - $this->loadConfigOverrides($config_file); + $this->loadConfigOverrides($override_file); $this->generateTree(); } @@ -84,11 +69,13 @@ class Daux private function loadConfigOverrides($config_file) { - $config_file = $this->docs_path . DS . $config_file; + $this->options = json_decode(file_get_contents($this->local_base . DS . 'default.json'), true); + + $config_file = $this->local_base . DS . $config_file; if (!file_exists($config_file)) { throw new Exception('The local config file is missing. Check path : ' . $config_file); } - $this->options = json_decode(file_get_contents($this->local_base . DS . 'default.json'), true); + if (is_file($config_file)) { $config = json_decode(file_get_contents($config_file), true); if (!isset($config)) { @@ -96,6 +83,7 @@ class Daux } $this->options = array_merge($this->options, $config); } + if (isset($this->options['timezone'])) { date_default_timezone_set($this->options['timezone']); } elseif (!ini_get('date.timezone')) { @@ -139,21 +127,8 @@ class Daux } } - if ($this->mode == self::LIVE_MODE) { - $params['index_key'] = 'index'; - $params['host'] = $this->host; - $params['base_page'] = $params['base_url'] = '//' . $this->base_url; - if (!$this->options['clean_urls']) { - $params['base_page'] .= 'index.php/'; - } - - if ($params['image'] !== '') { - $params['image'] = str_replace('', $params['base_url'], $params['image']); - } - } else { - $params['index_key'] = 'index.html'; - $params['base_page'] = $params['base_url'] = ''; - } + $params['index_key'] = 'index.html'; + $params['base_page'] = $params['base_url'] = ''; $params['theme'] = DauxHelper::getTheme( $this->options['theme-name'], diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index 0abde93..aca6901 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -1,5 +1,7 @@ value[$node])) { + $tree = $tree->value[$node]; + continue; + } + + // At this stage, we're in a directory, but no + // sub-item matches, so the current node must + // be an index page or we failed + if ($node !== 'index' && $node !== 'index.html') { + return false; + } + + return $tree->getIndexPage(); + } + + // If the entry we found is not a directory, we're done + if (!$tree instanceof Directory) { + return $tree; + } + + if ($tree->getIndexPage()) { + return $tree->getIndexPage(); + } + + return false; + } } diff --git a/libs/Format/Base/MarkdownPage.php b/libs/Format/Base/MarkdownPage.php new file mode 100644 index 0000000..1506175 --- /dev/null +++ b/libs/Format/Base/MarkdownPage.php @@ -0,0 +1,45 @@ +initializePage($title, $content); + } + + public function setFile(Content $file) + { + $this->file = $file; + } + + public function setParams(array $params) + { + $this->params = $params; + } + + protected function generatePage() + { + return (new \Parsedown())->text($this->content); + } + + public static function fromFile(Content $file, $params) + { + $page = new static($file->title, file_get_contents($file->getPath())); + $page->setFile($file); + $page->setParams($params); + + return $page; + } +} diff --git a/libs/Format/Base/Page.php b/libs/Format/Base/Page.php new file mode 100644 index 0000000..3ee5d23 --- /dev/null +++ b/libs/Format/Base/Page.php @@ -0,0 +1,6 @@ +file = $filename; + } + + public function getFile() + { + return $this->file; + } + + public function getContent() + { + throw new Exception("you should not use this method to show a raw content"); + } +} diff --git a/libs/Format/Base/SimplePage.php b/libs/Format/Base/SimplePage.php new file mode 100644 index 0000000..6e783a4 --- /dev/null +++ b/libs/Format/Base/SimplePage.php @@ -0,0 +1,33 @@ +initializePage($title, $content); + } + + public function getContent() + { + if (is_null($this->generated)) { + $this->generated = $this->generatePage(); + } + + return $this->generated; + } + + protected function initializePage($title, $content) + { + $this->title = $title; + $this->content = $content; + } + + protected function generatePage() + { + return $this->content; + } +} diff --git a/libs/MarkdownPage.php b/libs/Format/HTML/MarkdownPage.php similarity index 67% rename from libs/MarkdownPage.php rename to libs/Format/HTML/MarkdownPage.php index 6cb4d46..784ba83 100644 --- a/libs/MarkdownPage.php +++ b/libs/Format/HTML/MarkdownPage.php @@ -1,48 +1,28 @@ -initialize($file, $params); - return $instance; - } - - private function initialize(Content $file, $params) - { - $this->file = $file; - $this->params = $params; - $this->title = $file->title; - $this->homepage = false; if ($this->title === 'index') { - $minimum_parent_dir_size = ($params['multilanguage']) ? 2 : 1; - if (count($file->getParents()) >= $minimum_parent_dir_size) { - $parents = $file->getParents(); + $minimum_parent_dir_size = ($this->params['multilanguage']) ? 2 : 1; + if (count($this->file->getParents()) >= $minimum_parent_dir_size) { + $parents = $this->file->getParents(); $this->title = end($parents)->getTitle(); } else { $this->homepage = ($this->file->getName() === '_index'); - $this->title = $params['title']; + $this->title = $this->params['title']; } } $this->language = ''; - if ($params['multilanguage'] && count($file->getParents())) { - reset($file->getParents()); - $language_dir = current($file->getParents()); + if ($this->params['multilanguage'] && count($this->file->getParents())) { + reset($this->file->getParents()); + $language_dir = current($this->file->getParents()); $this->language = $language_dir->name; } } @@ -61,18 +41,9 @@ class MarkdownPage extends SimplePage return $breadcrumb_trail; } - public function getContent() - { - if (is_null($this->html)) { - $this->content = file_get_contents($this->file->getPath()); - $this->html = $this->generatePage(); - } - - return $this->html; - } - - private function generatePage() + protected function generatePage() { + $this->initialize(); $params = $this->params; $entry_page = []; diff --git a/libs/Format/HTML/RawPage.php b/libs/Format/HTML/RawPage.php new file mode 100644 index 0000000..fcff274 --- /dev/null +++ b/libs/Format/HTML/RawPage.php @@ -0,0 +1,6 @@ +file = $filename; - } - - public function getContent() - { - throw new Exception("you should not use this method to show a raw content"); - } - - public function display() - { - header('Content-type: ' . MimeType::get($this->file)); - - // Transfer file in 1024 byte chunks to save memory usage. - if ($fd = fopen($this->file, 'rb')) { - while (!feof($fd)) { - print fread($fd, 1024); - } - fclose($fd); - } - } -} diff --git a/libs/Server/ErrorPage.php b/libs/Server/ErrorPage.php index 7520877..bf1ef15 100644 --- a/libs/Server/ErrorPage.php +++ b/libs/Server/ErrorPage.php @@ -1,7 +1,7 @@ params = $params; } - public function display() - { - http_response_code(404); - parent::display(); - } - - public function getContent() - { - if (is_null($this->html)) { - $this->html = $this->generatePage(); - } - - return $this->html; - } - - private function generatePage() + protected function generatePage() { $params = $this->params; $page['title'] = $this->title; diff --git a/libs/Server/Server.php b/libs/Server/Server.php index 4565092..38923ec 100644 --- a/libs/Server/Server.php +++ b/libs/Server/Server.php @@ -1,18 +1,20 @@ handle($_REQUEST); } catch (NotFoundException $e) { + http_response_code(404); $page = new ErrorPage("An error occured", $e->getMessage(), $daux->getParams()); } - $page->display(); + if ($page instanceof RawPage) { + header('Content-type: ' . MimeType::get($page->getFile())); + + // Transfer file in 1024 byte chunks to save memory usage. + if ($fd = fopen($page->getFile(), 'rb')) { + while (!feof($fd)) { + print fread($fd, 1024); + } + fclose($fd); + } + + return; + } + + header('Content-type: text/html; charset=utf-8'); + echo $page->getContent(); } public function __construct(Daux $daux) { $this->daux = $daux; + + $this->host = $_SERVER['HTTP_HOST']; + $this->base_url = $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']); + $t = strrpos($this->base_url, '/index.php'); + if ($t != false) { + $this->base_url = substr($this->base_url, 0, $t); + } + if (substr($this->base_url, -1) !== '/') { + $this->base_url .= '/'; + } + } + + public function getParams() + { + $params = $this->daux->getParams(); + + $params['index_key'] = 'index'; + $params['host'] = $this->host; + $params['base_page'] = $params['base_url'] = '//' . $this->base_url; + if (!$this->daux->options['clean_urls']) { + $params['base_page'] .= 'index.php/'; + } + + if ($params['image'] !== '') { + $params['image'] = str_replace('', $params['base_url'], $params['image']); + } + + return $params; } public function handle($query = []) { - $this->params = $this->daux->getParams(); + $this->params = $this->getParams(); $request = $this->getRequest(); $request = urldecode($request); @@ -75,50 +121,9 @@ class Server return new SimplePage('Success', 'Successfully Edited'); } - private function getFile($request) - { - $tree = $this->daux->tree; - $request = explode('/', $request); - foreach ($request as $node) { - // If the element we're in currently is not a - // directory, we failed to find the requested file - if (!$tree instanceof Directory) { - return false; - } - - // if the node exists in the current request tree, - // change the $tree variable to reference the new - // node and proceed to the next url part - if (isset($tree->value[$node])) { - $tree = $tree->value[$node]; - continue; - } - - // At this stage, we're in a directory, but no - // sub-item matches, so the current node must - // be an index page or we failed - if ($node !== 'index' && $node !== 'index.html') { - return false; - } - - return $tree->getIndexPage(); - } - - // If the entry we found is not a directory, we're done - if (!$tree instanceof Directory) { - return $tree; - } - - if ($tree->getIndexPage()) { - return $tree->getIndexPage(); - } - - return false; - } - private function getPage($request) { - $file = $this->getFile($request); + $file = DauxHelper::getFile($this->daux->tree, $request); if ($file === false) { throw new NotFoundException('The Page you requested is yet to be made. Try again later.'); } diff --git a/libs/SimplePage.php b/libs/SimplePage.php deleted file mode 100644 index 6f41488..0000000 --- a/libs/SimplePage.php +++ /dev/null @@ -1,39 +0,0 @@ -initializePage($title, $content); - } - - public function display() - { - header('Content-type: text/html; charset=utf-8'); - echo $this->getContent(); - } - - public function getContent() - { - if (is_null($this->html)) { - $this->html = $this->generatePage(); - } - - return $this->html; - } - - private function initializePage($title, $content) - { - $this->title = $title; - $this->content = $content; - } - - private function generatePage() - { - return $this->content; - } -} diff --git a/libs/Tree/Builder.php b/libs/Tree/Builder.php index b538846..baa1e46 100644 --- a/libs/Tree/Builder.php +++ b/libs/Tree/Builder.php @@ -1,7 +1,6 @@ value as $node) { if ($node instanceof Content) { - if (!count($node->getParents()) && $node->title == 'index') { - //the homepage should not count as first page - continue; - } - + if (!count($node->getParents()) && $node->title == 'index') { + //the homepage should not count as first page + continue; + } + $this->first_page = $node; return $node; } From 1445bf7c0ff9a8655388473c700a221c253ec5db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Thu, 21 May 2015 17:39:11 +0200 Subject: [PATCH 019/127] Added confluence export type, starts to work --- composer.json | 3 +- composer.lock | 205 ++++++++++++++- generate.php | 19 +- libs/DauxHelper.php | 15 ++ libs/Format/Confluence/Api.php | 90 +++++++ libs/Format/Confluence/Generator.php | 150 +++++++++++ libs/Format/Confluence/MarkdownPage.php | 50 ++++ libs/Format/HTML/Generator.php | 60 +++++ libs/Generator/Generator.php | 61 +---- libs/Generator/Getopt.php | 331 ++++++++++++++++++++++++ 10 files changed, 929 insertions(+), 55 deletions(-) create mode 100644 libs/Format/Confluence/Api.php create mode 100644 libs/Format/Confluence/Generator.php create mode 100644 libs/Format/Confluence/MarkdownPage.php create mode 100644 libs/Format/HTML/Generator.php create mode 100644 libs/Generator/Getopt.php diff --git a/composer.json b/composer.json index 594c8c7..a0cf1af 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,8 @@ "require": { "php": ">=5.4", "erusev/parsedown": "~1.0", - "league/plates": "~3.1" + "league/plates": "~3.1", + "guzzlehttp/guzzle": "~5.3" }, "autoload": { "psr-4": {"Todaymade\\Daux\\": "libs/"} diff --git a/composer.lock b/composer.lock index 542feec..8be7745 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "183de90aad5bcf722f046eb01453cdc0", + "hash": "82c1c29dbd870c4ee2ea79c0561ea5d8", "packages": [ { "name": "erusev/parsedown", @@ -45,6 +45,165 @@ ], "time": "2014-05-14 10:14:49" }, + { + "name": "guzzlehttp/guzzle", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "f3c8c22471cb55475105c14769644a49c3262b93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f3c8c22471cb55475105c14769644a49c3262b93", + "reference": "f3c8c22471cb55475105c14769644a49c3262b93", + "shasum": "" + }, + "require": { + "guzzlehttp/ringphp": "^1.1", + "php": ">=5.4.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.0", + "psr/log": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2015-05-20 03:47:55" + }, + { + "name": "guzzlehttp/ringphp", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/RingPHP.git", + "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/dbbb91d7f6c191e5e405e900e3102ac7f261bc0b", + "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b", + "shasum": "" + }, + "require": { + "guzzlehttp/streams": "~3.0", + "php": ">=5.4.0", + "react/promise": "~2.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "ext-curl": "Guzzle will use specific adapters if cURL is present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Ring\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.", + "time": "2015-05-20 03:37:09" + }, + { + "name": "guzzlehttp/streams", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/streams.git", + "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/streams/zipball/47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5", + "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Provides a simple abstraction over streams of data", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "stream" + ], + "time": "2014-10-12 19:18:40" + }, { "name": "league/plates", "version": "3.1.0", @@ -96,6 +255,50 @@ "views" ], "time": "2014-10-21 12:06:12" + }, + { + "name": "react/promise", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "365fcee430dfa4ace1fbc75737ca60ceea7eeeef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/365fcee430dfa4ace1fbc75737ca60ceea7eeeef", + "reference": "365fcee430dfa4ace1fbc75737ca60ceea7eeeef", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "React\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@googlemail.com" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "time": "2014-12-30 13:32:42" } ], "packages-dev": [], diff --git a/generate.php b/generate.php index e7766b5..5099db7 100644 --- a/generate.php +++ b/generate.php @@ -67,9 +67,22 @@ require_once("vendor/autoload.php"); \Todaymade\Daux\Daux::initConstants(); -$global_config = (isset($argv[1]))? $argv[1] : null; -$destination = (isset($argv[2]))? $argv[2] : null; +$rules = [ + 'config|c-s' => 'Configuration file', + 'format|f-s' => 'Output format, html or confluence (default:html)', + + //HTML + 'destination|d-s' => 'Destination folder, relative to the working directory (default:static)', +]; + +$options = new \Todaymade\Daux\Generator\Getopt($rules, $argv); + +$default = [ + 'config' => null, + 'format' => 'html', + 'destination' => null, +]; $generator = new \Todaymade\Daux\Generator\Generator(); -$generator->generate($global_config, $destination); +$generator->generate($options->getOptions() + $default); diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index aca6901..cee077a 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -50,6 +50,21 @@ class DauxHelper return $theme; } + public static function getCleanPath($path) { + $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); + $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen'); + $absolutes = array(); + foreach ($parts as $part) { + if ('.' == $part) continue; + if ('..' == $part) { + array_pop($absolutes); + } else { + $absolutes[] = $part; + } + } + return implode(DIRECTORY_SEPARATOR, $absolutes); + } + public static function pathinfo($path) { preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $m); diff --git a/libs/Format/Confluence/Api.php b/libs/Format/Confluence/Api.php new file mode 100644 index 0000000..1e3f6d5 --- /dev/null +++ b/libs/Format/Confluence/Api.php @@ -0,0 +1,90 @@ +base_url = $base_url; + $this->user = $user; + $this->pass = $pass; + $this->setSpace($space_id); + } + + public function setSpace($space_id) { + $this->space = $space_id; + } + + /** + * /rest/api/content/{id}/child/{type} + * + * @param $rootPage + * @return mixed + */ + public function getHierarchy($rootPage) { + $hiera = $this->getClient()->get("content/$rootPage/child/page?expand=version,body.storage")->json(); + + $children = []; + foreach($hiera['results'] as $result) { + $children[$result['title']] = [ + "id" => $result['id'], + "title" => $result['title'], + "version" => $result['version']['number'], + "content" => $result['body']['storage']['value'], + "children" => $this->getHierarchy($result['id']) + ]; + } + + return $children; + } + + public function createPage($parent_id, $title, $content) { + + $body = [ + 'type' => 'page', + 'space' => ['key' => $this->space], + 'ancestors' => [['type' => 'page', 'id' => $parent_id]], + 'title' => $title, + 'body' => ['storage' => ['value' => $content, 'representation' => 'storage']] + ]; + + $response = $this->getClient()->post('content', [ 'json' => $body ])->json(); + + return $response['id']; + } + + public function updatePage($parent_id, $page_id, $newVersion, $title, $content) { + $body = [ + 'type' => 'page', + 'space' => ['key' => $this->space], + 'ancestors' => [['type' => 'page', 'id' => $parent_id]], + 'version' => ['number' => $newVersion, "minorEdit" => false], + 'title' => $title, + 'body' => ['storage' => ['value' => $content, 'representation' => 'storage']] + ]; + + $this->getClient()->put("content/$page_id", [ 'json' => $body ])->json(); + } + + public function deletePage($page_id) { + return $this->getClient()->delete('content/' . $page_id)->json(); + } + + protected function getClient() { + + $options = [ + 'base_url' => $this->base_url . 'rest/api/', + 'defaults' => [ + 'auth' => [$this->user, $this->pass] + ] + ]; + + return new Client($options); + } +} diff --git a/libs/Format/Confluence/Generator.php b/libs/Format/Confluence/Generator.php new file mode 100644 index 0000000..0592fba --- /dev/null +++ b/libs/Format/Confluence/Generator.php @@ -0,0 +1,150 @@ +getParams()['confluence']; + + $this->prefix = trim($confluence['prefix']) . " "; + + $main_title = $this->prefix . $daux->getParams()['title']; + + $params = $daux->getParams(); + + echo "Generating Tree...\n"; + $tree = $this->generateRecursive($daux->tree, $params); + $tree['title'] = $main_title; + + echo "Getting already published pages...\n"; + $this->client = new Api($confluence['base_url'], $confluence['user'], $confluence['pass'], $confluence['space_id']); + $all_published = $this->client->getHierarchy($confluence['ancestor_id']); + + echo "Finding Root Page...\n"; + $published = []; + foreach ($all_published as $page) { + if ($page['title'] == $main_title) { + $published = $page; + break; + } + } + + echo "Create placeholder pages...\n"; + $published = $this->createRecursive($confluence['ancestor_id'], $tree, $published); + + echo "Publishing updates...\n"; + $this->updateRecursive($confluence['ancestor_id'], $tree, $published); + + echo "Done !\n"; + } + + private function createRecursive($parent_id, $entry, $published) + { + //TODO :: remove deleted pages + + if (!array_key_exists('id', $published)) { + if (array_key_exists('page', $entry)) { + echo "Creating: " . $entry['file']->getUrl() . "\n"; + $published['id'] = $this->client->createPage($parent_id, $entry['title'], "The content will come very soon !"); + } else { + echo "Creating Placeholder page: " . $entry['title'] . "\n"; + $published['id'] = $this->client->createPage($parent_id, $entry['title'], ""); + } + } + + if (array_key_exists('children', $entry)) { + foreach($entry['children'] as $child) { + $pub = []; + if (array_key_exists('children', $published) && array_key_exists($child['title'], $published['children'])) { + $pub = $published['children'][$child['title']]; + } + + $published['children'][$child['title']] = $this->createRecursive($published['id'], $child, $pub); + } + } + + return $published; + } + + private function updateRecursive($parent_id, $entry, $published) + { + if (array_key_exists('id', $published) && array_key_exists('page', $entry)) { + echo "Updating: " . $entry['file']->getUrl() . "\n"; + try { + $this->client->updatePage( + $parent_id, + $published['id'], + $published['version'] + 1, + $entry['title'], + $entry['page']->getContent() + ); + } catch (ClientException $e) { + echo "-> Failed with message: " . $e->getResponse()->json()['message'] . "\n"; + } + } + + if (array_key_exists('children', $entry)) { + foreach($entry['children'] as $child) { + $pub = []; + if (array_key_exists('children', $published) && array_key_exists($child['title'], $published['children'])) { + $pub = $published['children'][$child['title']]; + } + + $this->updateRecursive($published['id'], $child, $pub); + } + } + } + + private function generateRecursive(Entry $tree, array $params, $base_url = '') + { + $final = ['title' => $this->prefix . $tree->getTitle()]; + $params['base_url'] = $params['base_page'] = $base_url; + + $params['image'] = str_replace('', $base_url, $params['image']); + if ($base_url !== '') { + $params['entry_page'] = $tree->getFirstPage(); + } + foreach ($tree->value as $key => $node) { + if ($node instanceof Directory) { + $final['children'][$this->prefix . $node->getTitle()] = $this->generateRecursive($node, $params, '../' . $base_url); + } else if ($node instanceof Content) { + + $params['request'] = $node->getUrl(); + $params['file_uri'] = $node->getName(); + + $data = [ + 'title' => $this->prefix . $node->getTitle(), + 'file' => $node, + 'page' => MarkdownPage::fromFile($node, $params), + ]; + + if ($key == 'index.html') { + $final['title'] = $this->prefix . $tree->getTitle(); + $final['file'] = $node; + $final['page'] = $data['page']; + } else { + $final['children'][$data['title']] = $data; + } + } + } + + return $final; + } +} diff --git a/libs/Format/Confluence/MarkdownPage.php b/libs/Format/Confluence/MarkdownPage.php new file mode 100644 index 0000000..a7aa340 --- /dev/null +++ b/libs/Format/Confluence/MarkdownPage.php @@ -0,0 +1,50 @@ +]*src=['\"]([^\"]*)['\"][^>]*>/", + function ($matches) { + return str_replace($matches[1], $this->findImage($matches[1]), $matches[0]); + }, + $page + ); + + return $page; + } + + private function findImage($src) + { + //for protocol relative or http requests : keep the original one + if (substr($src, 0, strlen("http")) === "http" || substr($src, 0, strlen("//")) === "//") { + return $src; + } + + //Get the path to the file, relative to the root of the documentation + $url = DauxHelper::getCleanPath(dirname($this->file->getUrl()) . '/' . $src); + + //Get any file corresponding to the right one + $file = DauxHelper::getFile($this->params['tree'], $url); + + + if ($file === false) { + return $src; + } + + $encoded = base64_encode(file_get_contents($file->getPath())); + $extension = pathinfo($file->getPath(), PATHINFO_EXTENSION); + + if (!in_array($extension, ['jpg', 'jpeg', 'png', 'gif'])) { + return $src; + } + + return "data:image/$extension;base64,$encoded"; + } +} diff --git a/libs/Format/HTML/Generator.php b/libs/Format/HTML/Generator.php new file mode 100644 index 0000000..6a4b1ea --- /dev/null +++ b/libs/Format/HTML/Generator.php @@ -0,0 +1,60 @@ +getParams(); + if (is_null($destination)) { + $destination = $daux->local_base . DS . 'static'; + } + + echo "Copying Static assets ...\n"; + Helper::copyAssets($destination, $daux->local_base); + + echo "Generating ...\n"; + $this->generateRecursive($daux->tree, $destination, $params); + echo "Done !\n"; + } + + private function generateRecursive($tree, $output_dir, $params, $base_url = '') + { + $params['base_url'] = $params['base_page'] = $base_url; + + // Rebase Theme + $params['theme'] = DauxHelper::getTheme( + $params['theme-name'], + $params['base_url'], + $params['local_base'], + $base_url + ); + + $params['image'] = str_replace('', $base_url, $params['image']); + if ($base_url !== '') { + $params['entry_page'] = $tree->getFirstPage(); + } + foreach ($tree->value as $key => $node) { + if ($node instanceof Directory) { + $new_output_dir = $output_dir . DS . $key; + @mkdir($new_output_dir); + $this->generateRecursive($node, $new_output_dir, $params, '../' . $base_url); + } elseif ($node instanceof Content) { + echo "- " . $node->getUrl() . "\n"; + $params['request'] = $node->getUrl(); + $params['file_uri'] = $node->getName(); + + $page = MarkdownPage::fromFile($node, $params); + file_put_contents($output_dir . DS . $key, $page->getContent()); + } else { + echo "- " . $node->getUrl() . "\n"; + copy($node->getPath(), $output_dir . DS . $key); + } + } + } +} diff --git a/libs/Generator/Generator.php b/libs/Generator/Generator.php index b87daa3..859a719 100644 --- a/libs/Generator/Generator.php +++ b/libs/Generator/Generator.php @@ -1,63 +1,24 @@ initialize($global_config); + $daux->initialize(null, $options['config']); - $params = $daux->getParams(); - if (is_null($destination)) { - $destination = $daux->local_base . DS . 'static'; + switch(strtolower($options['format'])) { + case 'confluence': + (new ConfluenceGenerator())->generate($daux, $options['destination']); + break; + case 'html': + default: + (new HTMLGenerator())->generate($daux, $options['destination']); } - echo "Copying Static assets ...\n"; - Helper::copyAssets($destination, $daux->local_base); - - echo "Generating ...\n"; - $this->generateRecursive($daux->tree, $destination, $params); - echo "Done !\n"; - } - - private function generateRecursive($tree, $output_dir, $params, $base_url = '') - { - $params['base_url'] = $params['base_page'] = $base_url; - - // Rebase Theme - $params['theme'] = DauxHelper::getTheme( - $params['theme-name'], - $params['base_url'], - $params['local_base'], - $base_url - ); - - $params['image'] = str_replace('', $base_url, $params['image']); - if ($base_url !== '') { - $params['entry_page'] = $tree->getFirstPage(); - } - foreach ($tree->value as $key => $node) { - if ($node instanceof Directory) { - $new_output_dir = $output_dir . DS . $key; - @mkdir($new_output_dir); - $this->generateRecursive($node, $new_output_dir, $params, '../' . $base_url); - } elseif ($node instanceof Content) { - echo "- " . $node->getUrl() . "\n"; - $params['request'] = $node->getUrl(); - $params['file_uri'] = $node->getName(); - - $page = MarkdownPage::fromFile($node, $params); - file_put_contents($output_dir . DS . $key, $page->getContent()); - } else { - echo "- " . $node->getUrl() . "\n"; - copy($node->getPath(), $output_dir . DS . $key); - } - } } } diff --git a/libs/Generator/Getopt.php b/libs/Generator/Getopt.php new file mode 100644 index 0000000..eac8320 --- /dev/null +++ b/libs/Generator/Getopt.php @@ -0,0 +1,331 @@ +argv = $argv?: $_SERVER['argv']; + + $this->progname = $this->argv[0]; + $this->addRules($rules); + } + + /** + * Return a list of options that have been seen in the current argv. + * + * @return array + */ + public function getOptions() + { + $this->parse(); + return $this->options; + } + + /** + * Return the state of the option seen on the command line of the + * current application invocation. + * + * This function returns true, or the parameter value to the option, if any. + * If the option was not given, this function returns false. + * + * @param string $flag + * @return mixed + */ + public function getOption($flag) + { + $this->parse(); + + $flag = strtolower($flag); + + if (isset($this->ruleMap[$flag])) { + $flag = $this->ruleMap[$flag]; + if (isset($this->options[$flag])) { + return $this->options[$flag]; + } + } + return; + } + + /** + * Return a useful option reference, formatted for display in an + * error message. + * + * Note that this usage information is provided in most Exceptions + * generated by this class. + * + * @return string + */ + public function getUsageMessage() + { + $usage = "Usage: {$this->progname} [ options ]\n"; + $maxLen = 20; + $lines = array(); + foreach ($this->rules as $rule) { + if (isset($rule['isFreeformFlag'])) { + continue; + } + $flags = array(); + if (is_array($rule['alias'])) { + foreach ($rule['alias'] as $flag) { + $flags[] = (strlen($flag) == 1 ? '-' : '--') . $flag; + } + } + $linepart['name'] = implode('|', $flags); + if (isset($rule['param']) && $rule['param'] != 'none') { + $linepart['name'] .= '=""'; + switch ($rule['param']) { + case 'optional': + $linepart['name'] .= " (optional)"; + break; + case 'required': + $linepart['name'] .= " (required)"; + break; + } + } + if (strlen($linepart['name']) > $maxLen) { + $maxLen = strlen($linepart['name']); + } + $linepart['help'] = ''; + if (isset($rule['help'])) { + $linepart['help'] .= $rule['help']; + } + $lines[] = $linepart; + } + foreach ($lines as $linepart) { + $usage .= sprintf( + "%s %s\n", + str_pad($linepart['name'], $maxLen), + $linepart['help'] + ); + } + return $usage; + } + + /** + * Parse command-line arguments and find both long and short + * options. + * + * Also find option parameters, and remaining arguments after + * all options have been parsed. + * + * @return self + */ + public function parse() + { + if ($this->parsed === true) { + return $this; + } + + if (in_array('--help', $this->argv)) { + echo $this->getUsageMessage(); + exit; + } + + $this->options = array(); + + $long = []; + $short = ''; + foreach ($this->rules as $rule) { + foreach($rule['alias'] as $alias) { + + $prepared = $alias; + if ($rule['param'] == 'optional') { + $prepared .= '::'; + } elseif ($rule['param'] == 'required') { + $prepared .= ':'; + } + + if (strlen($alias) == 1) { + $short .= $prepared; + } else { + $long[] = $prepared; + } + } + } + + $result = getopt($short, $long); + + foreach ($result as $key => $value) { + $this->options[$this->ruleMap[$key]] = $value; + } + + $this->parsed = true; + + return $this; + } + + /** + * Define legal options using the Zend-style format. + * + * @param array $rules + * @throws InvalidArgumentException + */ + protected function addRules($rules) + { + foreach ($rules as $ruleCode => $helpMessage) { + // this may have to translate the long parm type if there + // are any complaints that =string will not work (even though that use + // case is not documented) + if (in_array(substr($ruleCode, -2, 1), array('-', '='))) { + $flagList = substr($ruleCode, 0, -2); + $delimiter = substr($ruleCode, -2, 1); + } else { + $flagList = $ruleCode; + $delimiter = $paramType = null; + } + + $flagList = strtolower($flagList); + + $flags = explode('|', $flagList); + $rule = array(); + $mainFlag = $flags[0]; + foreach ($flags as $flag) { + if (empty($flag)) { + throw new InvalidArgumentException("Blank flag not allowed in rule \"$ruleCode\"."); + } + + if (isset($this->ruleMap[$flag]) || (strlen($flag) != 1 && isset($this->rules[$flag]))) { + throw new InvalidArgumentException("Option \"-$flag\" is being defined more than once."); + } + + $this->ruleMap[$flag] = $mainFlag; + $rule['alias'][] = $flag; + } + $rule['param'] = 'none'; + if (isset($delimiter)) { + $rule['param'] = $delimiter == self::PARAM_REQUIRED? 'required' : 'optional'; + } + + $rule['help'] = $helpMessage; + $this->rules[$mainFlag] = $rule; + } + } +} From fa798ff1e4f0a17fb419ff34b2d27c4bfc4b5bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Thu, 21 May 2015 18:04:57 +0200 Subject: [PATCH 020/127] Bugfixes --- libs/Daux.php | 24 ++++++++++++++++-------- libs/Format/Confluence/Generator.php | 2 ++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/libs/Daux.php b/libs/Daux.php index 36ffd30..d2aeaa4 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -67,19 +67,27 @@ class Daux } } - private function loadConfigOverrides($config_file) + private function loadConfigOverrides($override_file) { + // Read main configuration $this->options = json_decode(file_get_contents($this->local_base . DS . 'default.json'), true); - $config_file = $this->local_base . DS . $config_file; - if (!file_exists($config_file)) { - throw new Exception('The local config file is missing. Check path : ' . $config_file); - } - - if (is_file($config_file)) { + // Read documentation overrides + $config_file = $this->docs_path . DS . 'config.json'; + if (file_exists($config_file)) { $config = json_decode(file_get_contents($config_file), true); if (!isset($config)) { - throw new Exception('There was an error parsing the Config file. Please review'); + throw new Exception('The local config file is missing. Check path : ' . $config_file); + } + $this->options = array_merge($this->options, $config); + } + + // Read command line overrides + $config_file = $this->local_base . DS . $override_file; + if (file_exists($config_file)) { + $config = json_decode(file_get_contents($config_file), true); + if (!isset($config)) { + throw new Exception('The local config file is missing. Check path : ' . $config_file); } $this->options = array_merge($this->options, $config); } diff --git a/libs/Format/Confluence/Generator.php b/libs/Format/Confluence/Generator.php index 0592fba..951146b 100644 --- a/libs/Format/Confluence/Generator.php +++ b/libs/Format/Confluence/Generator.php @@ -62,9 +62,11 @@ class Generator if (!array_key_exists('id', $published)) { if (array_key_exists('page', $entry)) { echo "Creating: " . $entry['file']->getUrl() . "\n"; + $published['version'] = 1; $published['id'] = $this->client->createPage($parent_id, $entry['title'], "The content will come very soon !"); } else { echo "Creating Placeholder page: " . $entry['title'] . "\n"; + $published['version'] = 1; $published['id'] = $this->client->createPage($parent_id, $entry['title'], ""); } } From 1fe3e62df39b479576a55838bf14534ba775aee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Fri, 22 May 2015 14:48:09 +0200 Subject: [PATCH 021/127] Improve confluence export Migrate from Parsedown to Commonmark --- composer.json | 4 +- composer.lock | 102 +++++---- libs/Daux.php | 2 +- libs/DauxHelper.php | 7 +- libs/Format/Base/MarkdownPage.php | 13 +- libs/Format/Confluence/Api.php | 130 +++++++++-- .../Format/Confluence/CommonMarkConverter.php | 26 +++ libs/Format/Confluence/FencedCodeRenderer.php | 85 +++++++ libs/Format/Confluence/Generator.php | 104 ++------- .../Confluence/IndentedCodeRenderer.php | 30 +++ libs/Format/Confluence/MarkdownPage.php | 60 ++++- libs/Format/Confluence/Publisher.php | 212 ++++++++++++++++++ libs/Format/HTML/MarkdownPage.php | 2 +- libs/Generator/Getopt.php | 3 +- 14 files changed, 611 insertions(+), 169 deletions(-) create mode 100644 libs/Format/Confluence/CommonMarkConverter.php create mode 100644 libs/Format/Confluence/FencedCodeRenderer.php create mode 100644 libs/Format/Confluence/IndentedCodeRenderer.php create mode 100644 libs/Format/Confluence/Publisher.php diff --git a/composer.json b/composer.json index a0cf1af..a999853 100644 --- a/composer.json +++ b/composer.json @@ -13,9 +13,9 @@ ], "require": { "php": ">=5.4", - "erusev/parsedown": "~1.0", "league/plates": "~3.1", - "guzzlehttp/guzzle": "~5.3" + "guzzlehttp/guzzle": "~5.3", + "league/commonmark": "0.8.*" }, "autoload": { "psr-4": {"Todaymade\\Daux\\": "libs/"} diff --git a/composer.lock b/composer.lock index 8be7745..d2afb82 100644 --- a/composer.lock +++ b/composer.lock @@ -4,47 +4,8 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "82c1c29dbd870c4ee2ea79c0561ea5d8", + "hash": "a7e29fdc079b4e2a588148bff949237a", "packages": [ - { - "name": "erusev/parsedown", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/erusev/parsedown.git", - "reference": "2da10d277b086372f17b96df6cdc903829e1dde0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/2da10d277b086372f17b96df6cdc903829e1dde0", - "reference": "2da10d277b086372f17b96df6cdc903829e1dde0", - "shasum": "" - }, - "type": "library", - "autoload": { - "psr-0": { - "Parsedown": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Emanuil Rusev", - "email": "hello@erusev.com", - "homepage": "http://erusev.com" - } - ], - "description": "Parser for Markdown.", - "homepage": "http://parsedown.org", - "keywords": [ - "markdown", - "parser" - ], - "time": "2014-05-14 10:14:49" - }, { "name": "guzzlehttp/guzzle", "version": "5.3.0", @@ -204,6 +165,67 @@ ], "time": "2014-10-12 19:18:40" }, + { + "name": "league/commonmark", + "version": "0.8.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "91696c88df298f75fdd2075e4bb19c6dbd7338ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91696c88df298f75fdd2075e4bb19c6dbd7338ca", + "reference": "91696c88df298f75fdd2075e4bb19c6dbd7338ca", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.4.8" + }, + "replace": { + "colinodell/commonmark-php": "*" + }, + "require-dev": { + "erusev/parsedown": "~1.0", + "jgm/commonmark": "0.19", + "michelf/php-markdown": "~1.4", + "phpunit/phpunit": "~4.3", + "phpunit/phpunit-mock-objects": "2.3.0", + "symfony/finder": "~2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.8-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "http://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Markdown parser for PHP based on the CommonMark spec", + "homepage": "https://github.com/thephpleague/commonmark", + "keywords": [ + "commonmark", + "markdown", + "parser" + ], + "time": "2015-04-29 18:01:46" + }, { "name": "league/plates", "version": "3.1.0", diff --git a/libs/Daux.php b/libs/Daux.php index d2aeaa4..ba50f48 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -84,7 +84,7 @@ class Daux // Read command line overrides $config_file = $this->local_base . DS . $override_file; - if (file_exists($config_file)) { + if (!is_null($override_file) && file_exists($config_file)) { $config = json_decode(file_get_contents($config_file), true); if (!isset($config)) { throw new Exception('The local config file is missing. Check path : ' . $config_file); diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index cee077a..157c9f7 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -50,12 +50,15 @@ class DauxHelper return $theme; } - public static function getCleanPath($path) { + public static function getCleanPath($path) + { $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen'); $absolutes = array(); foreach ($parts as $part) { - if ('.' == $part) continue; + if ('.' == $part) { + continue; + } if ('..' == $part) { array_pop($absolutes); } else { diff --git a/libs/Format/Base/MarkdownPage.php b/libs/Format/Base/MarkdownPage.php index 1506175..0481651 100644 --- a/libs/Format/Base/MarkdownPage.php +++ b/libs/Format/Base/MarkdownPage.php @@ -1,5 +1,6 @@ params = $params; } + protected function getMarkdownConverter() + { + return new CommonMarkConverter(); + } + + protected function convertPage($content) + { + return $this->getMarkdownConverter()->convertToHtml($content); + } + protected function generatePage() { - return (new \Parsedown())->text($this->content); + return $this->convertPage($this->content); } public static function fromFile(Content $file, $params) diff --git a/libs/Format/Confluence/Api.php b/libs/Format/Confluence/Api.php index 1e3f6d5..304e6b4 100644 --- a/libs/Format/Confluence/Api.php +++ b/libs/Format/Confluence/Api.php @@ -1,8 +1,12 @@ base_url = $base_url; $this->user = $user; $this->pass = $pass; - $this->setSpace($space_id); } - public function setSpace($space_id) { + public function setSpace($space_id) + { $this->space = $space_id; } + protected function getClient() + { + $options = [ + 'base_url' => $this->base_url . 'rest/api/', + 'defaults' => [ + 'auth' => [$this->user, $this->pass] + ] + ]; + + return new Client($options); + } + + /** + * The standard error message from guzzle is quite poor in informations, + * this will give little bit more sense to it and return it + * + * @param BadResponseException $e + * @return BadResponseException + */ + protected function handleError(BadResponseException $e) + { + $request = $e->getRequest(); + $response = $e->getResponse(); + + $level = floor($response->getStatusCode() / 100); + + if ($level == '4') { + $label = 'Client error response'; + } elseif ($level == '5') { + $label = 'Server error response'; + } else { + $label = 'Unsuccessful response'; + } + + $message = $label . + ' [url] ' . $request->getUrl() . + ' [status code] ' . $response->getStatusCode() . + ' [message] '; + + try { + $message .= $response->json()['message']; + } catch (ParseException $e) { + $message .= (string) $response->getBody(); + } + + return new BadResponseException($message, $request, $response, $e->getPrevious()); + } + /** * /rest/api/content/{id}/child/{type} * * @param $rootPage * @return mixed */ - public function getHierarchy($rootPage) { - $hiera = $this->getClient()->get("content/$rootPage/child/page?expand=version,body.storage")->json(); + public function getHierarchy($rootPage) + { + try { + $hierarchy = $this->getClient()->get("content/$rootPage/child/page?expand=version,body.storage")->json(); + } catch (BadResponseException $e) { + throw $this->handleError($e); + } $children = []; - foreach($hiera['results'] as $result) { + foreach ($hierarchy['results'] as $result) { $children[$result['title']] = [ "id" => $result['id'], "title" => $result['title'], @@ -44,8 +102,8 @@ class Api { return $children; } - public function createPage($parent_id, $title, $content) { - + public function createPage($parent_id, $title, $content) + { $body = [ 'type' => 'page', 'space' => ['key' => $this->space], @@ -54,12 +112,17 @@ class Api { 'body' => ['storage' => ['value' => $content, 'representation' => 'storage']] ]; - $response = $this->getClient()->post('content', [ 'json' => $body ])->json(); + try { + $response = $this->getClient()->post('content', [ 'json' => $body ])->json(); + } catch (BadResponseException $e) { + throw $this->handleError($e); + } return $response['id']; } - public function updatePage($parent_id, $page_id, $newVersion, $title, $content) { + public function updatePage($parent_id, $page_id, $newVersion, $title, $content) + { $body = [ 'type' => 'page', 'space' => ['key' => $this->space], @@ -69,22 +132,45 @@ class Api { 'body' => ['storage' => ['value' => $content, 'representation' => 'storage']] ]; - $this->getClient()->put("content/$page_id", [ 'json' => $body ])->json(); + try { + $this->getClient()->put("content/$page_id", ['json' => $body])->json(); + } catch (BadResponseException $e) { + throw $this->handleError($e); + } } - public function deletePage($page_id) { - return $this->getClient()->delete('content/' . $page_id)->json(); + public function deletePage($page_id) + { + try { + return $this->getClient()->delete('content/' . $page_id)->json(); + } catch (BadResponseException $e) { + throw $this->handleError($e); + } } - protected function getClient() { + public function uploadAttachment($id, $attachment) + { + //get if attachment is uploaded + try { + $result = $this->getClient()->get("content/$id/child/attachment?filename=$attachment[filename]")->json(); + } catch (BadResponseException $e) { + throw $this->handleError($e); + } - $options = [ - 'base_url' => $this->base_url . 'rest/api/', - 'defaults' => [ - 'auth' => [$this->user, $this->pass] - ] - ]; + $url = "content/$id/child/attachment" . (count($result['results'])? "/{$result['results'][0]['id']}/data" : ""); - return new Client($options); + try { + $this->getClient()->post( + $url, + [ + 'body' => ['file' => fopen($attachment['file']->getPath(), 'r')] , + 'headers' => ['X-Atlassian-Token' => 'nocheck'], + ] + ); + } catch (BadResponseException $e) { + throw $this->handleError($e); + } + + //FIXME :: When doing an update, Confluence does a null pointer exception } } diff --git a/libs/Format/Confluence/CommonMarkConverter.php b/libs/Format/Confluence/CommonMarkConverter.php new file mode 100644 index 0000000..d988022 --- /dev/null +++ b/libs/Format/Confluence/CommonMarkConverter.php @@ -0,0 +1,26 @@ +mergeConfig($config); + + //Add code renderer + $environment->addBlockRenderer('FencedCode', new FencedCodeRenderer()); + $environment->addBlockRenderer('IndentedCode', new IndentedCodeRenderer()); + + $this->docParser = new DocParser($environment); + $this->htmlRenderer = new HtmlRenderer($environment); + } +} diff --git a/libs/Format/Confluence/FencedCodeRenderer.php b/libs/Format/Confluence/FencedCodeRenderer.php new file mode 100644 index 0000000..3c19e27 --- /dev/null +++ b/libs/Format/Confluence/FencedCodeRenderer.php @@ -0,0 +1,85 @@ + 'html/xml', 'xml' => 'html/xml', 'js' => 'javascript']; + + /** + * @param AbstractBlock $block + * @param HtmlRendererInterface $htmlRenderer + * @param bool $inTightList + * + * @return HtmlElement|string + */ + public function render(AbstractBlock $block, HtmlRendererInterface $htmlRenderer, $inTightList = false) + { + if (!($block instanceof FencedCode)) { + throw new \InvalidArgumentException('Incompatible block type: ' . get_class($block)); + } + + $content = []; + + if ($language = $this->getLanguage($block->getInfoWords(), $htmlRenderer)) { + $content[] = new HtmlElement('ac:parameter', ['ac:name' => 'language'], $language); + } + + $content[] = new HtmlElement('ac:plain-text-body', [], 'getStringContent() . ']]>'); + + return new HtmlElement( + 'ac:structured-macro', + ['ac:name' => 'code'], + $content + ); + } + + public function getLanguage($infoWords, HtmlRendererInterface $htmlRenderer) + { + if (count($infoWords) === 0 || strlen($infoWords[0]) === 0) { + return false; + } + + $language = $htmlRenderer->escape($infoWords[0], true); + + if (array_key_exists($language, $this->known_conversions)) { + $language = $this->known_conversions[$language]; + } + + if (in_array($language, $this->supported_languages)) { + return $language; + } + + return false; + } +} diff --git a/libs/Format/Confluence/Generator.php b/libs/Format/Confluence/Generator.php index 951146b..ff839c7 100644 --- a/libs/Format/Confluence/Generator.php +++ b/libs/Format/Confluence/Generator.php @@ -1,6 +1,5 @@ getParams()['confluence']; $this->prefix = trim($confluence['prefix']) . " "; - $main_title = $this->prefix . $daux->getParams()['title']; - $params = $daux->getParams(); echo "Generating Tree...\n"; $tree = $this->generateRecursive($daux->tree, $params); - $tree['title'] = $main_title; + $tree['title'] = $this->prefix . $daux->getParams()['title']; - echo "Getting already published pages...\n"; - $this->client = new Api($confluence['base_url'], $confluence['user'], $confluence['pass'], $confluence['space_id']); - $all_published = $this->client->getHierarchy($confluence['ancestor_id']); - - echo "Finding Root Page...\n"; - $published = []; - foreach ($all_published as $page) { - if ($page['title'] == $main_title) { - $published = $page; - break; - } - } - - echo "Create placeholder pages...\n"; - $published = $this->createRecursive($confluence['ancestor_id'], $tree, $published); - - echo "Publishing updates...\n"; - $this->updateRecursive($confluence['ancestor_id'], $tree, $published); + echo "Start Publishing...\n"; + $publisher = new Publisher($confluence); + $publisher->publish($tree); echo "Done !\n"; } - private function createRecursive($parent_id, $entry, $published) - { - //TODO :: remove deleted pages - - if (!array_key_exists('id', $published)) { - if (array_key_exists('page', $entry)) { - echo "Creating: " . $entry['file']->getUrl() . "\n"; - $published['version'] = 1; - $published['id'] = $this->client->createPage($parent_id, $entry['title'], "The content will come very soon !"); - } else { - echo "Creating Placeholder page: " . $entry['title'] . "\n"; - $published['version'] = 1; - $published['id'] = $this->client->createPage($parent_id, $entry['title'], ""); - } - } - - if (array_key_exists('children', $entry)) { - foreach($entry['children'] as $child) { - $pub = []; - if (array_key_exists('children', $published) && array_key_exists($child['title'], $published['children'])) { - $pub = $published['children'][$child['title']]; - } - - $published['children'][$child['title']] = $this->createRecursive($published['id'], $child, $pub); - } - } - - return $published; - } - - private function updateRecursive($parent_id, $entry, $published) - { - if (array_key_exists('id', $published) && array_key_exists('page', $entry)) { - echo "Updating: " . $entry['file']->getUrl() . "\n"; - try { - $this->client->updatePage( - $parent_id, - $published['id'], - $published['version'] + 1, - $entry['title'], - $entry['page']->getContent() - ); - } catch (ClientException $e) { - echo "-> Failed with message: " . $e->getResponse()->json()['message'] . "\n"; - } - } - - if (array_key_exists('children', $entry)) { - foreach($entry['children'] as $child) { - $pub = []; - if (array_key_exists('children', $published) && array_key_exists($child['title'], $published['children'])) { - $pub = $published['children'][$child['title']]; - } - - $this->updateRecursive($published['id'], $child, $pub); - } - } - } - private function generateRecursive(Entry $tree, array $params, $base_url = '') { $final = ['title' => $this->prefix . $tree->getTitle()]; @@ -125,9 +42,12 @@ class Generator } foreach ($tree->value as $key => $node) { if ($node instanceof Directory) { - $final['children'][$this->prefix . $node->getTitle()] = $this->generateRecursive($node, $params, '../' . $base_url); - } else if ($node instanceof Content) { - + $final['children'][$this->prefix . $node->getTitle()] = $this->generateRecursive( + $node, + $params, + '../' . $base_url + ); + } elseif ($node instanceof Content) { $params['request'] = $node->getUrl(); $params['file_uri'] = $node->getName(); @@ -137,6 +57,10 @@ class Generator 'page' => MarkdownPage::fromFile($node, $params), ]; + // As the page is lazily generated + // We do it now to fail fast in case of problem + $data['page']->getContent(); + if ($key == 'index.html') { $final['title'] = $this->prefix . $tree->getTitle(); $final['file'] = $node; diff --git a/libs/Format/Confluence/IndentedCodeRenderer.php b/libs/Format/Confluence/IndentedCodeRenderer.php new file mode 100644 index 0000000..2270fa2 --- /dev/null +++ b/libs/Format/Confluence/IndentedCodeRenderer.php @@ -0,0 +1,30 @@ + 'code'], + new HtmlElement('ac:plain-text-body', [], 'getStringContent().']]>') + ); + } +} diff --git a/libs/Format/Confluence/MarkdownPage.php b/libs/Format/Confluence/MarkdownPage.php index a7aa340..896af37 100644 --- a/libs/Format/Confluence/MarkdownPage.php +++ b/libs/Format/Confluence/MarkdownPage.php @@ -1,18 +1,32 @@ ]*src=['\"]([^\"]*)['\"][^>]*>/", function ($matches) { - return str_replace($matches[1], $this->findImage($matches[1]), $matches[0]); + + if ($result = $this->findImage($matches[1], $matches[0])) { + return $result; + } + + return $matches[0]; }, $page ); @@ -20,7 +34,7 @@ class MarkdownPage extends \Todaymade\Daux\Format\Base\MarkdownPage return $page; } - private function findImage($src) + private function findImage($src, $tag) { //for protocol relative or http requests : keep the original one if (substr($src, 0, strlen("http")) === "http" || substr($src, 0, strlen("//")) === "//") { @@ -35,16 +49,46 @@ class MarkdownPage extends \Todaymade\Daux\Format\Base\MarkdownPage if ($file === false) { - return $src; + return false; } - $encoded = base64_encode(file_get_contents($file->getPath())); - $extension = pathinfo($file->getPath(), PATHINFO_EXTENSION); + $filename = basename($file->getPath()); - if (!in_array($extension, ['jpg', 'jpeg', 'png', 'gif'])) { - return $src; + //Add the attachment for later upload + $this->attachments[] = ['filename' => $filename, 'file' => $file]; + + return $this->createImageTag($filename, $this->getAttributes($tag)); + } + + private function getAttributes($tag) + { + $dom = new DOMDocument(); + $dom->loadHTML($tag); + + $img = $dom->getElementsByTagName('img')[0]; + + $attributes = ['align', 'class', 'title', 'style', 'alt', 'height', 'width']; + $used = []; + foreach ($attributes as $attr) { + if ($img->attributes->getNamedItem($attr)) { + $used[$attr] = $img->attributes->getNamedItem($attr)->value; + } } - return "data:image/$extension;base64,$encoded"; + return $used; + } + + private function createImageTag($filename, $attributes) + { + + $img = " $value) { + $img .= ' ac:' . $name.'="'.htmlentities($value, ENT_QUOTES, 'UTF-8', false).'"'; + } + + $img .= ">"; + + return $img; } } diff --git a/libs/Format/Confluence/Publisher.php b/libs/Format/Confluence/Publisher.php new file mode 100644 index 0000000..c53b05d --- /dev/null +++ b/libs/Format/Confluence/Publisher.php @@ -0,0 +1,212 @@ +confluence = $confluence; + + $this->client = new Api($confluence['base_url'], $confluence['user'], $confluence['pass']); + $this->client->setSpace($confluence['space_id']); + } + + public function publish(array $tree) + { + echo "Getting already published pages...\n"; + $all_published = $this->client->getHierarchy($this->confluence['ancestor_id']); + + echo "Finding Root Page...\n"; + $published = []; + foreach ($all_published as $page) { + if ($page['title'] == $tree['title']) { + $published = $page; + break; + } + } + + echo "Create placeholder pages...\n"; + $published = $this->createRecursive($this->confluence['ancestor_id'], $tree, $published); + + echo "Publishing updates...\n"; + $this->updateRecursive($this->confluence['ancestor_id'], $tree, $published); + } + + protected function niceTitle($title) + { + if ($title == "index.html") { + return "Homepage"; + } + + return rtrim(strtr($title, ['index.html' => '', '.html' => '']), "/"); + } + + protected function createPage($parent_id, $entry, $published) + { + if ($this->previous_title != "Creating") { + $this->previous_title = "Creating"; + echo "Creating Pages...\n"; + } + + echo "- " . $this->niceTitle($entry['file']->getUrl()); + $published['version'] = 1; + $published['id'] = $this->client->createPage($parent_id, $entry['title'], "The content will come very soon !"); + echo " √ \n"; + + return $published; + } + + protected function createPlaceholderPage($parent_id, $entry, $published) + { + if ($this->previous_title != "Creating Placeholder") { + $this->previous_title = "Creating Placeholder"; + echo "Creating Placeholder Pages...\n"; + } + + echo "- " . $entry['title']; + $published['version'] = 1; + $published['id'] = $this->client->createPage($parent_id, $entry['title'], ""); + echo " √ \n"; + + return $published; + } + + protected function recursiveWithCallback($parent_id, $entry, $published, $callback) + { + $published = $callback($parent_id, $entry, $published); + + if (array_key_exists('children', $entry)) { + foreach ($entry['children'] as $child) { + $pub = []; + if (isset($published['children']) && array_key_exists($child['title'], $published['children'])) { + $pub = $published['children'][$child['title']]; + } + + $published['children'][$child['title']] = $this->recursiveWithCallback( + $published['id'], + $child, + $pub, + $callback + ); + } + } + + return $published; + } + + protected function createRecursive($parent_id, $entry, $published) + { + $callback = function ($parent_id, $entry, $published) { + + //TODO :: remove deleted pages + + // nothing to do if the ID already exists + if (array_key_exists('id', $published)) { + return $published; + } + + if (array_key_exists('page', $entry)) { + return $this->createPage($parent_id, $entry, $published); + } + + // If we have no $entry['page'] it means the page + // doesn't exist, but to respect the hierarchy, + // we need a blank page there + return $this->createPlaceholderPage($parent_id, $entry, $published); + }; + + return $this->recursiveWithCallback($parent_id, $entry, $published, $callback); + } + + protected function updateRecursive($parent_id, $entry, $published) + { + $callback = function ($parent_id, $entry, $published) { + if (array_key_exists('id', $published) && array_key_exists('page', $entry)) { + $this->updatePage($parent_id, $entry, $published); + } + + return $published; + }; + + return $this->recursiveWithCallback($parent_id, $entry, $published, $callback); + } + + protected function shouldUpdate($local, $published) + { + if (!array_key_exists('content', $published)) { + return true; + } + + $trimmed_local = trim($local); + $trimmed_distant = trim($published['content']); + + if ($trimmed_local == $trimmed_distant) { + return false; + } + + similar_text($trimmed_local, $trimmed_distant, $percent); + + // I consider that if the files are 98% identical you + // don't need to update. This will work for false positives. + // But sadly will miss if it's just a typo update + if ($percent >= 98) { + return false; + } + + return true; + } + + protected function updatePage($parent_id, $entry, $published) + { + if ($this->previous_title != "Updating") { + $this->previous_title = "Updating"; + echo "Updating Pages...\n"; + } + + echo "- " . $this->niceTitle($entry['file']->getUrl()); + + try { + if ($this->shouldUpdate($entry['page']->getContent(), $published)) { + $this->client->updatePage( + $parent_id, + $published['id'], + $published['version'] + 1, + $entry['title'], + $entry['page']->getContent() + ); + echo " √\n"; + } else { + echo " √ (No update needed)\n"; + } + + if (count($entry['page']->attachments)) { + foreach ($entry['page']->attachments as $attachment) { + echo " With attachment: $attachment[filename]"; + $this->client->uploadAttachment($published['id'], $attachment); + echo " √\n"; + } + } + + } catch (BadResponseException $e) { + echo " X Failed with message: " . $e->getMessage() . "\n"; + } + } +} diff --git a/libs/Format/HTML/MarkdownPage.php b/libs/Format/HTML/MarkdownPage.php index 784ba83..1cc76c1 100644 --- a/libs/Format/HTML/MarkdownPage.php +++ b/libs/Format/HTML/MarkdownPage.php @@ -69,7 +69,7 @@ class MarkdownPage extends \Todaymade\Daux\Format\Base\MarkdownPage 'modified_time' => filemtime($this->file->getPath()), 'markdown' => $this->content, 'request' => $params['request'], - 'content' => (new \Parsedown())->text($this->content), + 'content' => $this->convertPage($this->content), 'breadcrumbs' => $params['breadcrumbs'] ]; diff --git a/libs/Generator/Getopt.php b/libs/Generator/Getopt.php index eac8320..acfb222 100644 --- a/libs/Generator/Getopt.php +++ b/libs/Generator/Getopt.php @@ -254,8 +254,7 @@ class Getopt $long = []; $short = ''; foreach ($this->rules as $rule) { - foreach($rule['alias'] as $alias) { - + foreach ($rule['alias'] as $alias) { $prepared = $alias; if ($rule['param'] == 'optional') { $prepared .= '::'; From 63d6b17ec4f4051e7eba640015f760062dc63971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Fri, 22 May 2015 15:05:16 +0200 Subject: [PATCH 022/127] Bugfixes related to themes and Commonmark migration --- docs/00_Getting_Started.md | 32 ++++++++++++++++---------------- libs/Daux.php | 11 ++++------- libs/DauxHelper.php | 14 +++++++++----- libs/Format/HTML/Generator.php | 7 +------ libs/Server/Server.php | 2 ++ 5 files changed, 32 insertions(+), 34 deletions(-) diff --git a/docs/00_Getting_Started.md b/docs/00_Getting_Started.md index 8de6561..7db6f6e 100644 --- a/docs/00_Getting_Started.md +++ b/docs/00_Getting_Started.md @@ -99,7 +99,7 @@ Daux provides native support for Clean URLs provided the webserver has its URL R To customize the look and feel of your documentation, you can create a `config.json` file in the of the `/docs` folder. The `config.json` file is a simple JSON object that you can use to change some of the basic settings of the documentation. -###Title: +### Title: Change the title bar in the docs ```json @@ -108,7 +108,7 @@ Change the title bar in the docs } ``` -###Themes: +### Themes: We have 4 built-in Bootstrap themes. To use one of the themes, just set the `theme` option to one of the following: * daux-blue @@ -122,7 +122,7 @@ We have 4 built-in Bootstrap themes. To use one of the themes, just set the `the } ``` -###Custom Theme: +### Custom Theme: To use a custom theme, just copy over the theme folder into the `themes` directory and set its value in the `theme` param in config.json ```json @@ -131,7 +131,7 @@ To use a custom theme, just copy over the theme folder into the `themes` directo } ``` -###Code Floating: +### Code Floating: By default your code blocks will be floated to a column on the right side of your content. To disable this feature, set the `float` property to `false`. ```json @@ -140,7 +140,7 @@ By default your code blocks will be floated to a column on the right side of you } ``` -###Toggling Code Blocks +### Toggling Code Blocks Some users might wish to hide the code blocks & view just the documentation. By setting the `toggle_code` property to `true`, you can offer a toggle button on the page. ```json @@ -150,7 +150,7 @@ Some users might wish to hide the code blocks & view just the documentation. By ``` -###GitHub Repo: +### GitHub Repo: Add a 'Fork me on GitHub' ribbon. ```json @@ -159,7 +159,7 @@ Add a 'Fork me on GitHub' ribbon. } ``` -###Twitter: +### Twitter: Include twitter follow buttons in the sidebar. ```json @@ -168,7 +168,7 @@ Include twitter follow buttons in the sidebar. } ``` -###Links: +### Links: Include custom links in the sidebar. ```json @@ -181,7 +181,7 @@ Include custom links in the sidebar. } ``` -###File editor: +### File editor: ![File editor](https://f.cloud.github.com/assets/1788727/1954191/44358884-81d1-11e3-859d-254b9fb81808.png) Enable front-end Markdown editor. _Disabled by default_. @@ -192,7 +192,7 @@ Enable front-end Markdown editor. _Disabled by default_. } ``` -###Google Analytics: +### Google Analytics: This will embed the google analytics tracking code. ```json @@ -201,7 +201,7 @@ This will embed the google analytics tracking code. } ``` -###Piwik Analytics: +### Piwik Analytics: This will embed the piwik tracking code. ```json @@ -218,7 +218,7 @@ You can Also give a specific Piwik ID as well. } ``` -###Ignore: +### Ignore: Set custom files and entire folders to ignore within your `/docs` folder. For files make sure to include the file extension in the name. For both files and folders, names are case-sensitive. ```json @@ -230,7 +230,7 @@ Set custom files and entire folders to ignore within your `/docs` folder. For fi } ``` -###Breadcrumb titles +### Breadcrumb titles Daux.io provides the option to present page titles as breadcrumb navigation. You can *optionally* specify the separator used for breadcrumbs. ```json @@ -240,7 +240,7 @@ Daux.io provides the option to present page titles as breadcrumb navigation. You } ``` -###Date Modified +### Date Modified By default, daux.io will display the last modified time as reported by the system underneath the title for each document. To disable this, change the option in your config.json to false. ```json @@ -249,7 +249,7 @@ By default, daux.io will display the last modified time as reported by the syste } ``` -###Timezone +### Timezone If your server does not have a default timezone set in php.ini, it may return errors when it tries to generate the last modified date/time for docs. To fix these errors, specify a timezone in your config file. Valid options are available in the [PHP Manual](http://php.net/manual/en/timezones.php). ```json @@ -258,7 +258,7 @@ If your server does not have a default timezone set in php.ini, it may return er } ``` -###Multi-language +### Multi-language Enables multi-language support which needs seperate directories for each language in `docs/` folder. ```json diff --git a/libs/Daux.php b/libs/Daux.php index ba50f48..4b885b2 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -109,6 +109,10 @@ class Daux } } + /** + * @todo make it an object + * @return array + */ public function getParams() { $params = $this->options += array( @@ -138,13 +142,6 @@ class Daux $params['index_key'] = 'index.html'; $params['base_page'] = $params['base_url'] = ''; - $params['theme'] = DauxHelper::getTheme( - $this->options['theme-name'], - $params['base_url'], - $this->local_base, - $params['base_url'] - ); - return $params; } } diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index 157c9f7..6e6fe44 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -4,10 +4,10 @@ use Todaymade\Daux\Tree\Directory; class DauxHelper { - public static function getTheme($theme_name, $base_url, $local_base, $current_url) + public static function getTheme($params, $current_url) { - $theme_folder = $local_base . DS . 'resources' . DS . 'themes' . DS . $theme_name; - $theme_url = $base_url . "resources/themes/" . $theme_name . '/'; + $theme_folder = $params['local_base'] . DS . 'resources' . DS . 'themes' . DS . $params['theme-name']; + $theme_url = $params['base_url'] . "resources/themes/" . $params['theme-name'] . '/'; $theme = array(); if (is_file($theme_folder . DS . "config.json")) { @@ -19,7 +19,7 @@ class DauxHelper //Default parameters for theme $theme += [ - 'name' => $theme_name, + 'name' => $params['theme-name'], 'css' => [], 'js' => [], 'fonts' => [], @@ -29,7 +29,11 @@ class DauxHelper 'templates' => $theme_folder . DS . 'templates', ]; - $substitutions = ['' => $local_base, '' => $current_url, '' => $theme_url]; + $substitutions = [ + '' => $params['local_base'], + '' => $current_url, + '' => $theme_url + ]; // Substitute some placeholders $theme['templates'] = strtr($theme['templates'], $substitutions); diff --git a/libs/Format/HTML/Generator.php b/libs/Format/HTML/Generator.php index 6a4b1ea..34696d2 100644 --- a/libs/Format/HTML/Generator.php +++ b/libs/Format/HTML/Generator.php @@ -28,12 +28,7 @@ class Generator $params['base_url'] = $params['base_page'] = $base_url; // Rebase Theme - $params['theme'] = DauxHelper::getTheme( - $params['theme-name'], - $params['base_url'], - $params['local_base'], - $base_url - ); + $params['theme'] = DauxHelper::getTheme($params, $base_url); $params['image'] = str_replace('', $base_url, $params['image']); if ($base_url !== '') { diff --git a/libs/Server/Server.php b/libs/Server/Server.php index 38923ec..e3c15ed 100644 --- a/libs/Server/Server.php +++ b/libs/Server/Server.php @@ -78,6 +78,8 @@ class Server $params['image'] = str_replace('', $params['base_url'], $params['image']); } + $params['theme'] = DauxHelper::getTheme($params, $this->base_url); + return $params; } From 890163479009cdf1db91a6cd5d9e90e8e726103c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Fri, 22 May 2015 16:15:28 +0200 Subject: [PATCH 023/127] Fix bugs and optimized upload time --- libs/Format/Confluence/Api.php | 76 +++++++++++++++++++++++----- libs/Format/Confluence/Publisher.php | 13 +++-- 2 files changed, 70 insertions(+), 19 deletions(-) diff --git a/libs/Format/Confluence/Api.php b/libs/Format/Confluence/Api.php index 304e6b4..04a7d1e 100644 --- a/libs/Format/Confluence/Api.php +++ b/libs/Format/Confluence/Api.php @@ -74,6 +74,42 @@ class Api return new BadResponseException($message, $request, $response, $e->getPrevious()); } + /** + * /rest/api/content/{id}/child/{type} + * + * @param $rootPage + * @return mixed + */ + public function getList($rootPage) + { + $url = "content/$rootPage/child/page?expand=version"; + + $pages = []; + + do { + try { + $list = $this->getClient()->get($url)->json(); + } catch (BadResponseException $e) { + throw $this->handleError($e); + } + + foreach ($list['results'] as $result) { + $pages[$result['title']] = [ + "id" => $result['id'], + "title" => $result['title'], + "version" => $result['version']['number'], + ]; + } + + if (array_key_exists('next', $list['_links'])) { + $url = $list['_links']['next']; + } + + } while (array_key_exists('next', $list['_links'])); + + return $pages; + } + /** * /rest/api/content/{id}/child/{type} * @@ -82,22 +118,34 @@ class Api */ public function getHierarchy($rootPage) { - try { - $hierarchy = $this->getClient()->get("content/$rootPage/child/page?expand=version,body.storage")->json(); - } catch (BadResponseException $e) { - throw $this->handleError($e); - } + //We do a limit of 15 as it appears that confluence has + //a bug when retrieving more than 20 entries with "body.storage" + $url = "content/$rootPage/child/page?expand=version,body.storage&limit=15"; $children = []; - foreach ($hierarchy['results'] as $result) { - $children[$result['title']] = [ - "id" => $result['id'], - "title" => $result['title'], - "version" => $result['version']['number'], - "content" => $result['body']['storage']['value'], - "children" => $this->getHierarchy($result['id']) - ]; - } + + do { + try { + $hierarchy = $this->getClient()->get($url)->json(); + } catch (BadResponseException $e) { + throw $this->handleError($e); + } + + foreach ($hierarchy['results'] as $result) { + $children[$result['title']] = [ + "id" => $result['id'], + "title" => $result['title'], + "version" => $result['version']['number'], + "content" => $result['body']['storage']['value'], + "children" => $this->getHierarchy($result['id']) + ]; + } + + if (array_key_exists('next', $hierarchy['_links'])) { + $url = $hierarchy['_links']['next']; + } + + } while (array_key_exists('next', $hierarchy['_links'])); return $children; } diff --git a/libs/Format/Confluence/Publisher.php b/libs/Format/Confluence/Publisher.php index c53b05d..e0af7bd 100644 --- a/libs/Format/Confluence/Publisher.php +++ b/libs/Format/Confluence/Publisher.php @@ -31,18 +31,21 @@ class Publisher public function publish(array $tree) { - echo "Getting already published pages...\n"; - $all_published = $this->client->getHierarchy($this->confluence['ancestor_id']); - echo "Finding Root Page...\n"; - $published = []; - foreach ($all_published as $page) { + $pages = $this->client->getList($this->confluence['ancestor_id']); + $published = null; + foreach ($pages as $page) { if ($page['title'] == $tree['title']) { $published = $page; break; } } + echo "Getting already published pages...\n"; + if ($published != null) { + $published['children'] = $this->client->getHierarchy($published['id']); + } + echo "Create placeholder pages...\n"; $published = $this->createRecursive($this->confluence['ancestor_id'], $tree, $published); From 100568bfbb64fc88a4c491cb9ca9f8bf39970389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Fri, 22 May 2015 16:35:20 +0200 Subject: [PATCH 024/127] Preload more data in getList --- libs/Format/Confluence/Api.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/Format/Confluence/Api.php b/libs/Format/Confluence/Api.php index 04a7d1e..a82d9c8 100644 --- a/libs/Format/Confluence/Api.php +++ b/libs/Format/Confluence/Api.php @@ -82,7 +82,9 @@ class Api */ public function getList($rootPage) { - $url = "content/$rootPage/child/page?expand=version"; + //We do a limit of 15 as it appears that confluence has + //a bug when retrieving more than 20 entries with "body.storage" + $url = "content/$rootPage/child/page?expand=version,body.storage&limit=15"; $pages = []; @@ -98,6 +100,7 @@ class Api "id" => $result['id'], "title" => $result['title'], "version" => $result['version']['number'], + "content" => $result['body']['storage']['value'], ]; } From 60b50919b4a6f698c168ea277d5875c1c93769f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Mon, 29 Jun 2015 16:11:01 +0200 Subject: [PATCH 025/127] Remove "default.json" concentrate all configurations in "global.json" Set configurations in an Object instead of an array --- default.json | 29 ------------ global.json | 30 +++++++++++- libs/Config.php | 20 ++++++++ libs/Daux.php | 70 +++++++++++++++------------- libs/Format/Base/MarkdownPage.php | 5 +- libs/Format/Confluence/Generator.php | 3 +- libs/Generator/Generator.php | 3 +- 7 files changed, 92 insertions(+), 68 deletions(-) delete mode 100755 default.json create mode 100644 libs/Config.php diff --git a/default.json b/default.json deleted file mode 100755 index 999a593..0000000 --- a/default.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "title": "My Project", - "tagline": "My Stylish Documentation", - "author": "I, Me & Myself", - "image": "", - "repo": "", - "twitter": [], - "links": { - }, - - "languages": {}, - "theme": "daux-blue", - "ignore": { - "files": [], - "folders": [] - }, - - "breadcrumbs": false, - "clean_urls": false, - "toggle_code": false, - "date_modified": false, - "float": false, - "file_editor": false, - "timezone": "America/Los_Angeles", - - "google_analytics": false, - "piwik_analytics": false, - "piwik_analytics_id": "0" -} diff --git a/global.json b/global.json index 30b6e2e..d1b9c10 100644 --- a/global.json +++ b/global.json @@ -1,4 +1,32 @@ { "docs_directory": "docs", - "valid_markdown_extensions": ["md", "markdown"] + "valid_markdown_extensions": ["md", "markdown"], + + "title": "My Project", + "tagline": "My Stylish Documentation", + "author": "I, Me & Myself", + "image": "", + "repo": "", + "twitter": [], + "links": { + }, + + "languages": {}, + "theme": "daux-blue", + "ignore": { + "files": [], + "folders": [] + }, + + "breadcrumbs": false, + "clean_urls": false, + "toggle_code": false, + "date_modified": false, + "float": false, + "file_editor": false, + "timezone": "America/Los_Angeles", + + "google_analytics": false, + "piwik_analytics": false, + "piwik_analytics_id": "0" } diff --git a/libs/Config.php b/libs/Config.php new file mode 100644 index 0000000..a32aabb --- /dev/null +++ b/libs/Config.php @@ -0,0 +1,20 @@ + $value) { + if (array_key_exists($key, $this) && $override == false) { + continue; + } + + $this[$key] = $value; + } + } + + public function conservativeMerge($newValues) { + $this->merge($newValues, false); + } +} diff --git a/libs/Daux.php b/libs/Daux.php index 4b885b2..02ca792 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -15,6 +15,9 @@ class Daux * @var Tree\Entry */ public $tree; + /** + * @var Config + */ public $options; private $mode; @@ -30,48 +33,48 @@ class Daux define("DS", DIRECTORY_SEPARATOR); } - public function initialize($global_config_file = null, $override_file = 'config.json') + public function initialize($override_file = 'config.json') { - $this->loadConfig($global_config_file); + //global.json (docs dir, markdown files) + $this->loadConfig(); + + //config.json $this->loadConfigOverrides($override_file); + $this->generateTree(); } - private function loadConfig($global_config_file) + private function loadConfig() { - if (is_null($global_config_file)) { - $global_config_file = $this->local_base . DS . 'global.json'; - } + $default_config = [ + 'docs_directory' => 'docs', + 'valid_markdown_extensions' => ['md', 'markdown'] + ]; + + $global_config_file = $this->local_base . DS . 'global.json'; + if (!file_exists($global_config_file)) { throw new Exception('The Global Config file is missing. Requested File : ' . $global_config_file); } - $global_config = json_decode(file_get_contents($global_config_file), true); - if (!isset($global_config)) { + $default_config = array_merge($default_config, json_decode(file_get_contents($global_config_file), true)); + if (!isset($default_config)) { throw new Exception('The Global Config file is corrupt. Check that the JSON encoding is correct'); } - if (!isset($global_config['docs_directory'])) { - throw new Exception('The Global Config file does not have the docs directory set.'); - } - - $this->docs_path = $global_config['docs_directory']; + $this->docs_path = $default_config['docs_directory']; if (!is_dir($this->docs_path) && !is_dir($this->docs_path = $this->local_base . DS . $this->docs_path)) { throw new Exception('The Docs directory does not exist. Check the path again : ' . $this->docs_path); } - if (!isset($global_config['valid_markdown_extensions'])) { - static::$VALID_MARKDOWN_EXTENSIONS = array('md', 'markdown'); - } else { - static::$VALID_MARKDOWN_EXTENSIONS = $global_config['valid_markdown_extensions']; - } + static::$VALID_MARKDOWN_EXTENSIONS = $default_config['valid_markdown_extensions']; + + $this->options = new Config(); + $this->options->merge($default_config); } private function loadConfigOverrides($override_file) { - // Read main configuration - $this->options = json_decode(file_get_contents($this->local_base . DS . 'default.json'), true); - // Read documentation overrides $config_file = $this->docs_path . DS . 'config.json'; if (file_exists($config_file)) { @@ -79,7 +82,7 @@ class Daux if (!isset($config)) { throw new Exception('The local config file is missing. Check path : ' . $config_file); } - $this->options = array_merge($this->options, $config); + $this->options->merge($config); } // Read command line overrides @@ -89,7 +92,7 @@ class Daux if (!isset($config)) { throw new Exception('The local config file is missing. Check path : ' . $config_file); } - $this->options = array_merge($this->options, $config); + $this->options->merge($config); } if (isset($this->options['timezone'])) { @@ -115,7 +118,7 @@ class Daux */ public function getParams() { - $params = $this->options += array( + $default = [ //Features 'multilanguage' => !empty($this->options['languages']), @@ -125,23 +128,24 @@ class Daux 'local_base' => $this->local_base, 'docs_path' => $this->docs_path, 'templates' => $this->local_base . DS . 'templates', - ); + ]; + $this->options->conservativeMerge($default); if ($this->tree) { - $params['tree'] = $this->tree; - $params['index'] = ($index = $this->tree->getIndexPage()) ? $index : $this->tree->getFirstPage(); - if ($params['multilanguage']) { + $this->options['tree'] = $this->tree; + $this->options['index'] = ($index = $this->tree->getIndexPage()) ? $index : $this->tree->getFirstPage(); + if ($this->options['multilanguage']) { foreach ($this->options['languages'] as $key => $name) { - $params['entry_page'][$key] = $this->tree->value[$key]->getFirstPage(); + $this->options['entry_page'][$key] = $this->tree->value[$key]->getFirstPage(); } } else { - $params['entry_page'] = $this->tree->getFirstPage(); + $this->options['entry_page'] = $this->tree->getFirstPage(); } } - $params['index_key'] = 'index.html'; - $params['base_page'] = $params['base_url'] = ''; + $this->options['index_key'] = 'index.html'; + $this->options['base_page'] = $this->options['base_url'] = ''; - return $params; + return $this->options; } } diff --git a/libs/Format/Base/MarkdownPage.php b/libs/Format/Base/MarkdownPage.php index 0481651..e844b19 100644 --- a/libs/Format/Base/MarkdownPage.php +++ b/libs/Format/Base/MarkdownPage.php @@ -1,6 +1,7 @@ file = $file; } - public function setParams(array $params) + public function setParams(Config $params) { $this->params = $params; } diff --git a/libs/Format/Confluence/Generator.php b/libs/Format/Confluence/Generator.php index ff839c7..d690ce6 100644 --- a/libs/Format/Confluence/Generator.php +++ b/libs/Format/Confluence/Generator.php @@ -1,5 +1,6 @@ $this->prefix . $tree->getTitle()]; $params['base_url'] = $params['base_page'] = $base_url; diff --git a/libs/Generator/Generator.php b/libs/Generator/Generator.php index 859a719..46dd8c8 100644 --- a/libs/Generator/Generator.php +++ b/libs/Generator/Generator.php @@ -9,7 +9,7 @@ class Generator public function generate($options) { $daux = new Daux(Daux::STATIC_MODE); - $daux->initialize(null, $options['config']); + $daux->initialize($options['config']); switch(strtolower($options['format'])) { case 'confluence': @@ -19,6 +19,5 @@ class Generator default: (new HTMLGenerator())->generate($daux, $options['destination']); } - } } From 5791fccea8c4c7e1fe6aa74e9bf51970ba7ef9f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Mon, 29 Jun 2015 16:16:39 +0200 Subject: [PATCH 026/127] Added internal documentation links --- docs/00_Getting_Started.md | 2 + docs/01_Examples/05_Code_Highlighting.md | 3 + .../CommonMark}/CommonMarkConverter.php | 16 +++-- libs/Format/Base/CommonMark/LinkRenderer.php | 63 +++++++++++++++++++ libs/Format/Base/MarkdownPage.php | 9 ++- .../CommonMark/CommonMarkConverter.php | 20 ++++++ .../{ => CommonMark}/FencedCodeRenderer.php | 2 +- .../{ => CommonMark}/IndentedCodeRenderer.php | 2 +- .../Confluence/CommonMark/LinkRenderer.php | 43 +++++++++++++ libs/Format/Confluence/MarkdownPage.php | 4 +- 10 files changed, 154 insertions(+), 10 deletions(-) rename libs/Format/{Confluence => Base/CommonMark}/CommonMarkConverter.php (58%) create mode 100644 libs/Format/Base/CommonMark/LinkRenderer.php create mode 100644 libs/Format/Confluence/CommonMark/CommonMarkConverter.php rename libs/Format/Confluence/{ => CommonMark}/FencedCodeRenderer.php (97%) rename libs/Format/Confluence/{ => CommonMark}/IndentedCodeRenderer.php (94%) create mode 100644 libs/Format/Confluence/CommonMark/LinkRenderer.php diff --git a/docs/00_Getting_Started.md b/docs/00_Getting_Started.md index 7db6f6e..a5809ac 100644 --- a/docs/00_Getting_Started.md +++ b/docs/00_Getting_Started.md @@ -367,3 +367,5 @@ If you have a global mime map entry for `.less` files set for the server, you wi ## Support If you need help using Daux.io, or have found a bug, please create an issue on the GitHub repo. + +[Code Highlighting examples](!Examples/Code_Highlighting) diff --git a/docs/01_Examples/05_Code_Highlighting.md b/docs/01_Examples/05_Code_Highlighting.md index 5310bb7..dd5bf52 100644 --- a/docs/01_Examples/05_Code_Highlighting.md +++ b/docs/01_Examples/05_Code_Highlighting.md @@ -1,5 +1,8 @@ Highlight.js highlights syntax in code examples on blogs, forums and in fact on any web pages. It's very easy to use because it works automatically: finds blocks of code, detects a language, highlights it. [Learn more.](http://softwaremaniacs.org/soft/highlight/en/) +You can even use [Github Flavored Markdown](!Examples/GitHub_Flavored_Markdown) + + **Python** @requires_authorization diff --git a/libs/Format/Confluence/CommonMarkConverter.php b/libs/Format/Base/CommonMark/CommonMarkConverter.php similarity index 58% rename from libs/Format/Confluence/CommonMarkConverter.php rename to libs/Format/Base/CommonMark/CommonMarkConverter.php index d988022..c907050 100644 --- a/libs/Format/Confluence/CommonMarkConverter.php +++ b/libs/Format/Base/CommonMark/CommonMarkConverter.php @@ -1,4 +1,4 @@ -mergeConfig($config); - //Add code renderer - $environment->addBlockRenderer('FencedCode', new FencedCodeRenderer()); - $environment->addBlockRenderer('IndentedCode', new IndentedCodeRenderer()); + $this->extendEnvironment($environment); $this->docParser = new DocParser($environment); $this->htmlRenderer = new HtmlRenderer($environment); } + + protected function getLinkRenderer(Environment $environment) + { + return new LinkRenderer($environment->getConfig('daux')); + } + + protected function extendEnvironment(Environment $environment) + { + $environment->addInlineRenderer('Link', $this->getLinkRenderer($environment)); + } } diff --git a/libs/Format/Base/CommonMark/LinkRenderer.php b/libs/Format/Base/CommonMark/LinkRenderer.php new file mode 100644 index 0000000..26e75c4 --- /dev/null +++ b/libs/Format/Base/CommonMark/LinkRenderer.php @@ -0,0 +1,63 @@ +daux = $daux; + } + + /** + * @param $url + * @return Entry + * @throws Exception + */ + protected function resolveInternalFile($url) { + + $file = DauxHelper::getFile($this->daux['tree'], $url); + if ($file) { + return $file; + } + + $file = DauxHelper::getFile($this->daux['tree'], $url . '.html'); + if ($file) { + return $file; + } + + throw new Exception("Could not locate file '$url'"); + } + + /** + * @param Link $inline + * @param HtmlRendererInterface $htmlRenderer + * + * @return HtmlElement + */ + public function render(AbstractInline $inline, HtmlRendererInterface $htmlRenderer) + { + $element = parent::render($inline, $htmlRenderer); + + $url = $inline->getUrl(); + if (!empty($url) && $url[0] == '!') { + $file = $this->resolveInternalFile(ltrim($url, "!")); + + $element->setAttribute('href', $this->daux['base_url'] . $file->getUrl()); + } + + return $element; + } +} diff --git a/libs/Format/Base/MarkdownPage.php b/libs/Format/Base/MarkdownPage.php index e844b19..ac189ea 100644 --- a/libs/Format/Base/MarkdownPage.php +++ b/libs/Format/Base/MarkdownPage.php @@ -1,7 +1,7 @@ file = $file; } + public function getFile() + { + return $this->file; + } + public function setParams(Config $params) { $this->params = $params; @@ -33,7 +38,7 @@ abstract class MarkdownPage extends SimplePage protected function getMarkdownConverter() { - return new CommonMarkConverter(); + return new CommonMarkConverter(['daux' => $this->params]); } protected function convertPage($content) diff --git a/libs/Format/Confluence/CommonMark/CommonMarkConverter.php b/libs/Format/Confluence/CommonMark/CommonMarkConverter.php new file mode 100644 index 0000000..7685f55 --- /dev/null +++ b/libs/Format/Confluence/CommonMark/CommonMarkConverter.php @@ -0,0 +1,20 @@ +getConfig('daux')); + } + + protected function extendEnvironment(Environment $environment) + { + parent::extendEnvironment($environment); + + //Add code renderer + $environment->addBlockRenderer('FencedCode', new FencedCodeRenderer()); + $environment->addBlockRenderer('IndentedCode', new IndentedCodeRenderer()); + } +} diff --git a/libs/Format/Confluence/FencedCodeRenderer.php b/libs/Format/Confluence/CommonMark/FencedCodeRenderer.php similarity index 97% rename from libs/Format/Confluence/FencedCodeRenderer.php rename to libs/Format/Confluence/CommonMark/FencedCodeRenderer.php index 3c19e27..5d938d5 100644 --- a/libs/Format/Confluence/FencedCodeRenderer.php +++ b/libs/Format/Confluence/CommonMark/FencedCodeRenderer.php @@ -1,4 +1,4 @@ -getUrl(); + if (empty($url) || $url[0] != '!') { + return $element; + } + + //Internal links + $file = $this->resolveInternalFile(ltrim($url, "!")); + + $link_props = [ + 'ri:content-title' => trim($this->daux['confluence']['prefix']) . " " . $file->getTitle(), + 'ri:space-key' => $this->daux['confluence']['space_id'] + ]; + + $page = strval(new HtmlElement('ri:page', $link_props, '', true)); + $children = $htmlRenderer->renderInlines($inline->getChildren()); + if (strpos($children, "<") !== false) { + $children = '' . $children . ''; + } else { + $children = ''; + } + + return new HtmlElement('ac:link', [], $page . $children); + } +} diff --git a/libs/Format/Confluence/MarkdownPage.php b/libs/Format/Confluence/MarkdownPage.php index 896af37..93bb4a2 100644 --- a/libs/Format/Confluence/MarkdownPage.php +++ b/libs/Format/Confluence/MarkdownPage.php @@ -2,6 +2,7 @@ use DOMDocument; use Todaymade\Daux\DauxHelper; +use Todaymade\Daux\Format\Confluence\CommonMark\CommonMarkConverter; class MarkdownPage extends \Todaymade\Daux\Format\Base\MarkdownPage { @@ -9,7 +10,7 @@ class MarkdownPage extends \Todaymade\Daux\Format\Base\MarkdownPage protected function getMarkdownConverter() { - return new CommonMarkConverter(); + return new CommonMarkConverter(['daux' => $this->params]); } protected function generatePage() @@ -80,7 +81,6 @@ class MarkdownPage extends \Todaymade\Daux\Format\Base\MarkdownPage private function createImageTag($filename, $attributes) { - $img = " $value) { From b5dd82fe2a3dc78e1f1d2a028c413a3a2f87b57f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Mon, 29 Jun 2015 16:16:55 +0200 Subject: [PATCH 027/127] Added debug to confluence publishing --- libs/Format/Confluence/Publisher.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/libs/Format/Confluence/Publisher.php b/libs/Format/Confluence/Publisher.php index e0af7bd..cb46b3c 100644 --- a/libs/Format/Confluence/Publisher.php +++ b/libs/Format/Confluence/Publisher.php @@ -158,7 +158,7 @@ class Publisher return true; } - $trimmed_local = trim($local); + $trimmed_local = trim($local->getContent()); $trimmed_distant = trim($published['content']); if ($trimmed_local == $trimmed_distant) { @@ -174,6 +174,17 @@ class Publisher return false; } + //DEBUG + if (getenv("DEBUG") && strtolower(getenv("DEBUG")) != "false") { + $prefix = 'static/export/'; + if (!is_dir($prefix)) { + mkdir($prefix, 0777, true); + } + $url = $local->getFile()->getUrl(); + file_put_contents($prefix . strtr($url, ['/' => '_', '.html' => '_local.html']), $trimmed_local); + file_put_contents($prefix . strtr($url, ['/' => '_', '.html' => '_distant.html']), $trimmed_distant); + } + return true; } @@ -187,7 +198,7 @@ class Publisher echo "- " . $this->niceTitle($entry['file']->getUrl()); try { - if ($this->shouldUpdate($entry['page']->getContent(), $published)) { + if ($this->shouldUpdate($entry['page'], $published)) { $this->client->updatePage( $parent_id, $published['id'], From e3c9ce98b8cdfe24ac26044f161d185c8a5bbd38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Tue, 30 Jun 2015 15:50:42 +0200 Subject: [PATCH 028/127] Use the right entry page --- libs/Format/HTML/Generator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/Format/HTML/Generator.php b/libs/Format/HTML/Generator.php index 34696d2..32369b1 100644 --- a/libs/Format/HTML/Generator.php +++ b/libs/Format/HTML/Generator.php @@ -31,7 +31,7 @@ class Generator $params['theme'] = DauxHelper::getTheme($params, $base_url); $params['image'] = str_replace('', $base_url, $params['image']); - if ($base_url !== '') { + if ($base_url !== '' && empty($params['entry_page'])) { $params['entry_page'] = $tree->getFirstPage(); } foreach ($tree->value as $key => $node) { From cd65072a20c38d066f54c61aeaf38de383dca9b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Tue, 14 Jul 2015 22:06:01 +0200 Subject: [PATCH 029/127] Use symfony console, nicer output --- composer.json | 3 +- composer.lock | 59 ++++- generate.php | 21 +- libs/Format/Base/RunAction.php | 22 ++ libs/Format/Confluence/Generator.php | 27 ++- libs/Format/Confluence/Publisher.php | 90 +++++--- libs/Format/HTML/Generator.php | 51 +++-- libs/Generator/Application.php | 49 ++++ libs/Generator/Command.php | 49 ++++ libs/Generator/Generator.php | 23 -- libs/Generator/Getopt.php | 330 --------------------------- vendor/composer/autoload_psr4.php | 2 + vendor/composer/installed.json | 59 +++++ 13 files changed, 359 insertions(+), 426 deletions(-) create mode 100644 libs/Format/Base/RunAction.php create mode 100644 libs/Generator/Application.php create mode 100644 libs/Generator/Command.php delete mode 100644 libs/Generator/Generator.php delete mode 100644 libs/Generator/Getopt.php diff --git a/composer.json b/composer.json index a999853..41ad4b9 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,8 @@ "php": ">=5.4", "league/plates": "~3.1", "guzzlehttp/guzzle": "~5.3", - "league/commonmark": "0.8.*" + "league/commonmark": "0.8.*", + "symfony/console": "~2.7" }, "autoload": { "psr-4": {"Todaymade\\Daux\\": "libs/"} diff --git a/composer.lock b/composer.lock index d2afb82..ceffecc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "a7e29fdc079b4e2a588148bff949237a", + "hash": "eda78cf80f9699aa99725c4330a8830a", "packages": [ { "name": "guzzlehttp/guzzle", @@ -321,6 +321,63 @@ ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", "time": "2014-12-30 13:32:42" + }, + { + "name": "symfony/console", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "8cf484449130cabfd98dcb4694ca9945802a21ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/8cf484449130cabfd98dcb4694ca9945802a21ed", + "reference": "8cf484449130cabfd98dcb4694ca9945802a21ed", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/phpunit-bridge": "~2.7", + "symfony/process": "~2.1" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2015-07-09 16:07:40" } ], "packages-dev": [], diff --git a/generate.php b/generate.php index 5099db7..89cfdd2 100644 --- a/generate.php +++ b/generate.php @@ -67,22 +67,5 @@ require_once("vendor/autoload.php"); \Todaymade\Daux\Daux::initConstants(); -$rules = [ - 'config|c-s' => 'Configuration file', - 'format|f-s' => 'Output format, html or confluence (default:html)', - - //HTML - 'destination|d-s' => 'Destination folder, relative to the working directory (default:static)', -]; - -$options = new \Todaymade\Daux\Generator\Getopt($rules, $argv); - -$default = [ - 'config' => null, - 'format' => 'html', - 'destination' => null, -]; - -$generator = new \Todaymade\Daux\Generator\Generator(); - -$generator->generate($options->getOptions() + $default); +$application = new \Todaymade\Daux\Generator\Application(); +$application->run(); diff --git a/libs/Format/Base/RunAction.php b/libs/Format/Base/RunAction.php new file mode 100644 index 0000000..1186a44 --- /dev/null +++ b/libs/Format/Base/RunAction.php @@ -0,0 +1,22 @@ +write($title); + // 8 is the length of the label + 2 let it breathe + $padding = $width - strlen($title) - 10; + try { + $response = $closure(); + } catch (\Exception $e) { + $output->writeln(str_pad(" ", $padding) . "[ FAIL ]"); + throw $e; + } + $output->writeln(str_pad(" ", $padding) . "[ OK ]"); + + return $response; + } +} diff --git a/libs/Format/Confluence/Generator.php b/libs/Format/Confluence/Generator.php index d690ce6..dfe1209 100644 --- a/libs/Format/Confluence/Generator.php +++ b/libs/Format/Confluence/Generator.php @@ -1,19 +1,23 @@ getParams()['confluence']; @@ -21,15 +25,24 @@ class Generator $params = $daux->getParams(); - echo "Generating Tree...\n"; - $tree = $this->generateRecursive($daux->tree, $params); - $tree['title'] = $this->prefix . $daux->getParams()['title']; + $tree = $this->runAction( + "Generating Tree ...", + $output, + $width, + function() use ($daux, $params) { + $tree = $this->generateRecursive($daux->tree, $params); + $tree['title'] = $this->prefix . $daux->getParams()['title']; + + return $tree; + } + ); + + $output->writeln("Start Publishing..."); - echo "Start Publishing...\n"; $publisher = new Publisher($confluence); + $publisher->output = $output; + $publisher->width = $width; $publisher->publish($tree); - - echo "Done !\n"; } private function generateRecursive(Entry $tree, Config $params, $base_url = '') diff --git a/libs/Format/Confluence/Publisher.php b/libs/Format/Confluence/Publisher.php index cb46b3c..8aa93af 100644 --- a/libs/Format/Confluence/Publisher.php +++ b/libs/Format/Confluence/Publisher.php @@ -2,10 +2,13 @@ use GuzzleHttp\Exception\BadResponseException; use GuzzleHttp\Exception\ParseException; +use Todaymade\Daux\Format\Base\RunAction; class Publisher { + use RunAction; + /** * @var Api */ @@ -21,6 +24,19 @@ class Publisher */ protected $previous_title; + /** + * @var string terminal width + */ + public $width; + + /** + * @var + */ + public $output; + + /** + * @param $confluence + */ public function __construct($confluence) { $this->confluence = $confluence; @@ -29,6 +45,14 @@ class Publisher $this->client->setSpace($confluence['space_id']); } + public function run($title, $closure) { + try { + return $this->runAction($title, $this->output, $this->width, $closure); + } catch (BadResponseException $e) { + echo " X Failed with message: " . $e->getMessage() . "\n"; + } + } + public function publish(array $tree) { echo "Finding Root Page...\n"; @@ -41,15 +65,23 @@ class Publisher } } - echo "Getting already published pages...\n"; - if ($published != null) { - $published['children'] = $this->client->getHierarchy($published['id']); - } + $this->run( + "Getting already published pages...", + function() use (&$published) { + if ($published != null) { + $published['children'] = $this->client->getHierarchy($published['id']); + } + } + ); - echo "Create placeholder pages...\n"; - $published = $this->createRecursive($this->confluence['ancestor_id'], $tree, $published); + $published = $this->run( + "Create placeholder pages...", + function() use ($tree, $published) { + return $this->createRecursive($this->confluence['ancestor_id'], $tree, $published); + } + ); - echo "Publishing updates...\n"; + $this->output->writeLn("Publishing updates..."); $this->updateRecursive($this->confluence['ancestor_id'], $tree, $published); } @@ -195,32 +227,30 @@ class Publisher echo "Updating Pages...\n"; } - echo "- " . $this->niceTitle($entry['file']->getUrl()); - - try { - if ($this->shouldUpdate($entry['page'], $published)) { - $this->client->updatePage( - $parent_id, - $published['id'], - $published['version'] + 1, - $entry['title'], - $entry['page']->getContent() - ); - echo " √\n"; - } else { - echo " √ (No update needed)\n"; - } - - if (count($entry['page']->attachments)) { - foreach ($entry['page']->attachments as $attachment) { - echo " With attachment: $attachment[filename]"; - $this->client->uploadAttachment($published['id'], $attachment); - echo " √\n"; + $this->run( + "- " . $this->niceTitle($entry['file']->getUrl()), + function() use ($entry, $published, $parent_id) { + if ($this->shouldUpdate($entry['page'], $published)) { + $this->client->updatePage( + $parent_id, + $published['id'], + $published['version'] + 1, + $entry['title'], + $entry['page']->getContent() + ); } } + ); - } catch (BadResponseException $e) { - echo " X Failed with message: " . $e->getMessage() . "\n"; + if (count($entry['page']->attachments)) { + foreach ($entry['page']->attachments as $attachment) { + $this->run( + " With attachment: $attachment[filename]", + function() use($published, $attachment) { + $this->client->uploadAttachment($published['id'], $attachment); + } + ); + } } } } diff --git a/libs/Format/HTML/Generator.php b/libs/Format/HTML/Generator.php index 32369b1..3f41f84 100644 --- a/libs/Format/HTML/Generator.php +++ b/libs/Format/HTML/Generator.php @@ -1,29 +1,38 @@ getParams(); if (is_null($destination)) { $destination = $daux->local_base . DS . 'static'; } - echo "Copying Static assets ...\n"; - Helper::copyAssets($destination, $daux->local_base); + $this->runAction( + "Copying Static assets ...", + $output, + $width, + function() use ($destination, $daux) { + Helper::copyAssets($destination, $daux->local_base); + } + ); - echo "Generating ...\n"; - $this->generateRecursive($daux->tree, $destination, $params); - echo "Done !\n"; + $output->writeLn("Generating ..."); + $this->generateRecursive($daux->tree, $destination, $params, $output, $width); } - private function generateRecursive($tree, $output_dir, $params, $base_url = '') + private function generateRecursive($tree, $output_dir, $params, $output, $width, $base_url = '') { $params['base_url'] = $params['base_page'] = $base_url; @@ -38,17 +47,29 @@ class Generator if ($node instanceof Directory) { $new_output_dir = $output_dir . DS . $key; @mkdir($new_output_dir); - $this->generateRecursive($node, $new_output_dir, $params, '../' . $base_url); + $this->generateRecursive($node, $new_output_dir, $params, $output, $width, '../' . $base_url); } elseif ($node instanceof Content) { - echo "- " . $node->getUrl() . "\n"; - $params['request'] = $node->getUrl(); - $params['file_uri'] = $node->getName(); + $this->runAction( + "- " . $node->getUrl(), + $output, + $width, + function() use ($node, $output_dir, $key, $params) { + $params['request'] = $node->getUrl(); + $params['file_uri'] = $node->getName(); - $page = MarkdownPage::fromFile($node, $params); - file_put_contents($output_dir . DS . $key, $page->getContent()); + $page = MarkdownPage::fromFile($node, $params); + file_put_contents($output_dir . DS . $key, $page->getContent()); + } + ); } else { - echo "- " . $node->getUrl() . "\n"; - copy($node->getPath(), $output_dir . DS . $key); + $this->runAction( + "- " . $node->getUrl(), + $output, + $width, + function() use ($node, $output_dir, $key) { + copy($node->getPath(), $output_dir . DS . $key); + } + ); } } } diff --git a/libs/Generator/Application.php b/libs/Generator/Application.php new file mode 100644 index 0000000..58fdc2b --- /dev/null +++ b/libs/Generator/Application.php @@ -0,0 +1,49 @@ +setArguments(); + + return $inputDefinition; + } +} diff --git a/libs/Generator/Command.php b/libs/Generator/Command.php new file mode 100644 index 0000000..69dca16 --- /dev/null +++ b/libs/Generator/Command.php @@ -0,0 +1,49 @@ +setName('generate') + ->setDescription('Generate documentation') + ->addOption('configuration', 'c', InputArgument::OPTIONAL, 'Configuration file') + ->addOption('format', 'f', InputArgument::OPTIONAL, 'Output format, html or confluence', 'html') + ->addOption('processor', 'p', InputArgument::OPTIONAL, 'Manipulations on the tree', 'none') + ->addOption('destination', 'd', InputArgument::OPTIONAL, $description, 'static'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $daux = new Daux(Daux::STATIC_MODE); + $daux->initialize($input->getOption('configuration')); + + $width = $this->getApplication()->getTerminalDimensions()[0]; + + switch(strtolower($input->getOption('processor'))) { + case 'none': + default: + //nothing + } + + switch(strtolower($input->getOption('format'))) { + case 'confluence': + (new ConfluenceGenerator())->generate($daux, $input->getOption('destination'), $output, $width); + break; + case 'html': + default: + (new HTMLGenerator())->generate($daux, $input->getOption('destination'), $output, $width); + } + } +} diff --git a/libs/Generator/Generator.php b/libs/Generator/Generator.php deleted file mode 100644 index 46dd8c8..0000000 --- a/libs/Generator/Generator.php +++ /dev/null @@ -1,23 +0,0 @@ -initialize($options['config']); - - switch(strtolower($options['format'])) { - case 'confluence': - (new ConfluenceGenerator())->generate($daux, $options['destination']); - break; - case 'html': - default: - (new HTMLGenerator())->generate($daux, $options['destination']); - } - } -} diff --git a/libs/Generator/Getopt.php b/libs/Generator/Getopt.php deleted file mode 100644 index acfb222..0000000 --- a/libs/Generator/Getopt.php +++ /dev/null @@ -1,330 +0,0 @@ -argv = $argv?: $_SERVER['argv']; - - $this->progname = $this->argv[0]; - $this->addRules($rules); - } - - /** - * Return a list of options that have been seen in the current argv. - * - * @return array - */ - public function getOptions() - { - $this->parse(); - return $this->options; - } - - /** - * Return the state of the option seen on the command line of the - * current application invocation. - * - * This function returns true, or the parameter value to the option, if any. - * If the option was not given, this function returns false. - * - * @param string $flag - * @return mixed - */ - public function getOption($flag) - { - $this->parse(); - - $flag = strtolower($flag); - - if (isset($this->ruleMap[$flag])) { - $flag = $this->ruleMap[$flag]; - if (isset($this->options[$flag])) { - return $this->options[$flag]; - } - } - return; - } - - /** - * Return a useful option reference, formatted for display in an - * error message. - * - * Note that this usage information is provided in most Exceptions - * generated by this class. - * - * @return string - */ - public function getUsageMessage() - { - $usage = "Usage: {$this->progname} [ options ]\n"; - $maxLen = 20; - $lines = array(); - foreach ($this->rules as $rule) { - if (isset($rule['isFreeformFlag'])) { - continue; - } - $flags = array(); - if (is_array($rule['alias'])) { - foreach ($rule['alias'] as $flag) { - $flags[] = (strlen($flag) == 1 ? '-' : '--') . $flag; - } - } - $linepart['name'] = implode('|', $flags); - if (isset($rule['param']) && $rule['param'] != 'none') { - $linepart['name'] .= '=""'; - switch ($rule['param']) { - case 'optional': - $linepart['name'] .= " (optional)"; - break; - case 'required': - $linepart['name'] .= " (required)"; - break; - } - } - if (strlen($linepart['name']) > $maxLen) { - $maxLen = strlen($linepart['name']); - } - $linepart['help'] = ''; - if (isset($rule['help'])) { - $linepart['help'] .= $rule['help']; - } - $lines[] = $linepart; - } - foreach ($lines as $linepart) { - $usage .= sprintf( - "%s %s\n", - str_pad($linepart['name'], $maxLen), - $linepart['help'] - ); - } - return $usage; - } - - /** - * Parse command-line arguments and find both long and short - * options. - * - * Also find option parameters, and remaining arguments after - * all options have been parsed. - * - * @return self - */ - public function parse() - { - if ($this->parsed === true) { - return $this; - } - - if (in_array('--help', $this->argv)) { - echo $this->getUsageMessage(); - exit; - } - - $this->options = array(); - - $long = []; - $short = ''; - foreach ($this->rules as $rule) { - foreach ($rule['alias'] as $alias) { - $prepared = $alias; - if ($rule['param'] == 'optional') { - $prepared .= '::'; - } elseif ($rule['param'] == 'required') { - $prepared .= ':'; - } - - if (strlen($alias) == 1) { - $short .= $prepared; - } else { - $long[] = $prepared; - } - } - } - - $result = getopt($short, $long); - - foreach ($result as $key => $value) { - $this->options[$this->ruleMap[$key]] = $value; - } - - $this->parsed = true; - - return $this; - } - - /** - * Define legal options using the Zend-style format. - * - * @param array $rules - * @throws InvalidArgumentException - */ - protected function addRules($rules) - { - foreach ($rules as $ruleCode => $helpMessage) { - // this may have to translate the long parm type if there - // are any complaints that =string will not work (even though that use - // case is not documented) - if (in_array(substr($ruleCode, -2, 1), array('-', '='))) { - $flagList = substr($ruleCode, 0, -2); - $delimiter = substr($ruleCode, -2, 1); - } else { - $flagList = $ruleCode; - $delimiter = $paramType = null; - } - - $flagList = strtolower($flagList); - - $flags = explode('|', $flagList); - $rule = array(); - $mainFlag = $flags[0]; - foreach ($flags as $flag) { - if (empty($flag)) { - throw new InvalidArgumentException("Blank flag not allowed in rule \"$ruleCode\"."); - } - - if (isset($this->ruleMap[$flag]) || (strlen($flag) != 1 && isset($this->rules[$flag]))) { - throw new InvalidArgumentException("Option \"-$flag\" is being defined more than once."); - } - - $this->ruleMap[$flag] = $mainFlag; - $rule['alias'][] = $flag; - } - $rule['param'] = 'none'; - if (isset($delimiter)) { - $rule['param'] = $delimiter == self::PARAM_REQUIRED? 'required' : 'optional'; - } - - $rule['help'] = $helpMessage; - $this->rules[$mainFlag] = $rule; - } - } -} diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 27c0cb8..34988f8 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -7,5 +7,7 @@ $baseDir = dirname($vendorDir); return array( 'Todaymade\\Daux\\' => array($baseDir . '/libs'), + 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), + 'React\\Promise\\' => array($vendorDir . '/react/promise/src'), 'League\\Plates\\' => array($vendorDir . '/league/plates/src'), ); diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 038a10c..065a379 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -93,5 +93,64 @@ "templating", "views" ] + }, + { + "name": "symfony/console", + "version": "v2.7.2", + "version_normalized": "2.7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "8cf484449130cabfd98dcb4694ca9945802a21ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/8cf484449130cabfd98dcb4694ca9945802a21ed", + "reference": "8cf484449130cabfd98dcb4694ca9945802a21ed", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/phpunit-bridge": "~2.7", + "symfony/process": "~2.1" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "time": "2015-07-09 16:07:40", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com" } ] From 4f33394c77ab250fcfd0b50e19fdc9c7f4c2aeba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Tue, 14 Jul 2015 23:35:47 +0200 Subject: [PATCH 030/127] Compile archive to phar --- bin/compile | 17 +++ composer.json | 3 +- composer.lock | 51 ++++++++- libs/Compiler.php | 166 ++++++++++++++++++++++++++++++ libs/Daux.php | 12 ++- vendor/composer/autoload_psr4.php | 1 + vendor/composer/installed.json | 51 +++++++++ 7 files changed, 295 insertions(+), 6 deletions(-) create mode 100755 bin/compile create mode 100644 libs/Compiler.php diff --git a/bin/compile b/bin/compile new file mode 100755 index 0000000..832aed5 --- /dev/null +++ b/bin/compile @@ -0,0 +1,17 @@ +#!/usr/bin/env php +compile(); +} catch (\Exception $e) { + echo 'Failed to compile phar: ['.get_class($e).'] '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine(); + exit(1); +} diff --git a/composer.json b/composer.json index 41ad4b9..1ddc56d 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,8 @@ "league/plates": "~3.1", "guzzlehttp/guzzle": "~5.3", "league/commonmark": "0.8.*", - "symfony/console": "~2.7" + "symfony/console": "~2.7", + "symfony/finder": "~2.7" }, "autoload": { "psr-4": {"Todaymade\\Daux\\": "libs/"} diff --git a/composer.lock b/composer.lock index ceffecc..bd3d968 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "eda78cf80f9699aa99725c4330a8830a", + "hash": "da1775dfe76954e5e731cba81179b910", "packages": [ { "name": "guzzlehttp/guzzle", @@ -378,6 +378,55 @@ "description": "Symfony Console Component", "homepage": "https://symfony.com", "time": "2015-07-09 16:07:40" + }, + { + "name": "symfony/finder", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "ae0f363277485094edc04c9f3cbe595b183b78e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/ae0f363277485094edc04c9f3cbe595b183b78e4", + "reference": "ae0f363277485094edc04c9f3cbe595b183b78e4", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2015-07-09 16:07:40" } ], "packages-dev": [], diff --git a/libs/Compiler.php b/libs/Compiler.php new file mode 100644 index 0000000..b088a23 --- /dev/null +++ b/libs/Compiler.php @@ -0,0 +1,166 @@ + + * @author Jordi Boggiano + * @author Stéphane Goetz + */ +class Compiler +{ + /** + * Compiles composer into a single phar file + * + * @throws \RuntimeException + * @param string $pharFile The full path to the file to create + */ + public function compile($pharFile = 'daux.phar') + { + if (file_exists($pharFile)) { + unlink($pharFile); + } + + $phar = new \Phar($pharFile, 0, 'daux.phar'); + $phar->setSignatureAlgorithm(\Phar::SHA1); + + $phar->startBuffering(); + + // Daux + $finder = new Finder(); + $finder->files() + ->ignoreVCS(true) + ->name('*.php') + ->notName('Compiler.php') + ->in(__DIR__ . '/../templates') + ->in(__DIR__); + + foreach ($finder as $file) { + $this->addFile($phar, $file); + } + + // Composer libraries + $finder = new Finder(); + $finder->files() + ->ignoreVCS(true) + ->exclude('Tests') + ->in(__DIR__ . '/../vendor/symfony/console') + ->in(__DIR__ . '/../vendor/guzzlehttp/guzzle/src/') + ->in(__DIR__ . '/../vendor/guzzlehttp/ringphp/src/') + ->in(__DIR__ . '/../vendor/guzzlehttp/streams/src/') + ->in(__DIR__ . '/../vendor/league/commonmark/src/') + ->in(__DIR__ . '/../vendor/league/plates/src/') + ->in(__DIR__ . '/../vendor/react/promise/src/'); + + foreach ($finder as $file) { + $this->addFile($phar, $file); + } + + // Composer autoload + $this->addFile($phar, new \SplFileInfo(__DIR__ . '/../vendor/autoload.php')); + $this->addFile($phar, new \SplFileInfo(__DIR__ . '/../vendor/composer/autoload_classmap.php')); + $this->addFile($phar, new \SplFileInfo(__DIR__ . '/../vendor/composer/autoload_files.php')); + $this->addFile($phar, new \SplFileInfo(__DIR__ . '/../vendor/composer/autoload_namespaces.php')); + $this->addFile($phar, new \SplFileInfo(__DIR__ . '/../vendor/composer/autoload_psr4.php')); + $this->addFile($phar, new \SplFileInfo(__DIR__ . '/../vendor/composer/autoload_real.php')); + $this->addFile($phar, new \SplFileInfo(__DIR__ . '/../vendor/composer/ClassLoader.php')); + $this->addBinary($phar); + + // Stubs + $phar->setStub($this->getStub()); + + $phar->stopBuffering(); + + $this->addFile($phar, new \SplFileInfo(__DIR__ . '/../LICENSE'), false); + + unset($phar); + } + + private function addFile($phar, $file, $strip = true) + { + $path = strtr(str_replace(dirname(__DIR__) . DIRECTORY_SEPARATOR, '', $file->getRealPath()), '\\', '/'); + + $content = file_get_contents($file); + if ($strip) { + $content = $this->stripWhitespace($content); + } elseif ('LICENSE' === basename($file)) { + $content = "\n" . $content . "\n"; + } + + $phar->addFromString($path, $content); + } + + private function addBinary($phar) + { + $content = file_get_contents(__DIR__ . '/../generate.php'); + //$content = preg_replace('{^#!/usr/bin/env php\s*}', '', $content); + $phar->addFromString('generate.php', $content); + } + + /** + * Removes whitespace from a PHP source string while preserving line numbers. + * + * @param string $source A PHP string + * @return string The PHP string with the whitespace removed + */ + private function stripWhitespace($source) + { + if (!function_exists('token_get_all')) { + return $source; + } + + $output = ''; + foreach (token_get_all($source) as $token) { + if (is_string($token)) { + $output .= $token; + } elseif (in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) { + $output .= str_repeat("\n", substr_count($token[1], "\n")); + } elseif (T_WHITESPACE === $token[0]) { + // reduce wide spaces + $whitespace = preg_replace('{[ \t]+}', ' ', $token[1]); + // normalize newlines to \n + $whitespace = preg_replace('{(?:\r\n|\r|\n)}', "\n", $whitespace); + // trim leading spaces + $whitespace = preg_replace('{\n +}', "\n", $whitespace); + $output .= $whitespace; + } else { + $output .= $token[1]; + } + } + + return $output; + } + + private function getStub() + { + return <<<'EOF' +#!/usr/bin/env php + + * + * For the full copyright and license information, please view + * the license that is located at the bottom of this file. + */ + +define('PHAR_DIR', dirname(__FILE__)); + +Phar::mapPhar('daux.phar'); + +require 'phar://daux.phar/generate.php'; + +__HALT_COMPILER(); +EOF; + } +} diff --git a/libs/Daux.php b/libs/Daux.php index 02ca792..bdb65b3 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -9,6 +9,7 @@ class Daux public static $VALID_MARKDOWN_EXTENSIONS; public $local_base; + public $internal_base; private $docs_path; /** @@ -25,7 +26,11 @@ class Daux { $this->mode = $mode; - $this->local_base = dirname(__DIR__); + $this->local_base = $this->internal_base = dirname(__DIR__); + + if (defined('PHAR_DIR')) { + $this->local_base = PHAR_DIR; + } } public static function initConstants() @@ -113,8 +118,7 @@ class Daux } /** - * @todo make it an object - * @return array + * @return Config */ public function getParams() { @@ -127,7 +131,7 @@ class Daux 'mode' => $this->mode, 'local_base' => $this->local_base, 'docs_path' => $this->docs_path, - 'templates' => $this->local_base . DS . 'templates', + 'templates' => $this->internal_base . DS . 'templates', ]; $this->options->conservativeMerge($default); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 34988f8..1a9e77b 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -7,6 +7,7 @@ $baseDir = dirname($vendorDir); return array( 'Todaymade\\Daux\\' => array($baseDir . '/libs'), + 'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), 'React\\Promise\\' => array($vendorDir . '/react/promise/src'), 'League\\Plates\\' => array($vendorDir . '/league/plates/src'), diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 065a379..5ec31ca 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -152,5 +152,56 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com" + }, + { + "name": "symfony/finder", + "version": "v2.7.2", + "version_normalized": "2.7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "ae0f363277485094edc04c9f3cbe595b183b78e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/ae0f363277485094edc04c9f3cbe595b183b78e4", + "reference": "ae0f363277485094edc04c9f3cbe595b183b78e4", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "time": "2015-07-09 16:07:40", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com" } ] From 1f4f18dccfec36f1089b4e875d226102b093d20e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Wed, 15 Jul 2015 11:06:01 +0200 Subject: [PATCH 031/127] Bugfixes in confluence --- libs/Format/Confluence/Publisher.php | 2 +- libs/Generator/Command.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/Format/Confluence/Publisher.php b/libs/Format/Confluence/Publisher.php index 8aa93af..332f459 100644 --- a/libs/Format/Confluence/Publisher.php +++ b/libs/Format/Confluence/Publisher.php @@ -49,7 +49,7 @@ class Publisher try { return $this->runAction($title, $this->output, $this->width, $closure); } catch (BadResponseException $e) { - echo " X Failed with message: " . $e->getMessage() . "\n"; + $this->output->writeLn(" " . $e->getMessage() . ""); } } diff --git a/libs/Generator/Command.php b/libs/Generator/Command.php index 69dca16..a0dc3a3 100644 --- a/libs/Generator/Command.php +++ b/libs/Generator/Command.php @@ -39,7 +39,7 @@ class Command extends SymfonyCommand switch(strtolower($input->getOption('format'))) { case 'confluence': - (new ConfluenceGenerator())->generate($daux, $input->getOption('destination'), $output, $width); + (new ConfluenceGenerator())->generate($daux, $output, $width); break; case 'html': default: From 74d35d1b597fd215e668f11100561f669f8332fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Wed, 15 Jul 2015 11:06:42 +0200 Subject: [PATCH 032/127] Remove vendor --- vendor/autoload.php | 7 - vendor/composer/ClassLoader.php | 413 -------------------------- vendor/composer/autoload_classmap.php | 9 - 3 files changed, 429 deletions(-) delete mode 100644 vendor/autoload.php delete mode 100644 vendor/composer/ClassLoader.php delete mode 100644 vendor/composer/autoload_classmap.php diff --git a/vendor/autoload.php b/vendor/autoload.php deleted file mode 100644 index 2bb0c0f..0000000 --- a/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0 class loader - * - * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - - private $classMapAuthoritative = false; - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-0 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 - if ('\\' == $class[0]) { - $class = substr($class, 1); - } - - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative) { - return false; - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if ($file === null && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if ($file === null) { - // Remember that this class does not exist. - return $this->classMap[$class] = false; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { - if (0 === strpos($class, $prefix)) { - foreach ($this->prefixDirsPsr4[$prefix] as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php deleted file mode 100644 index 7a91153..0000000 --- a/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,9 +0,0 @@ - Date: Wed, 15 Jul 2015 11:07:32 +0200 Subject: [PATCH 033/127] Add phar and ignore vendor --- .gitignore | 2 ++ daux.phar | Bin 0 -> 705436 bytes 2 files changed, 2 insertions(+) create mode 100755 daux.phar diff --git a/.gitignore b/.gitignore index 5120c5e..b8d6458 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ node_modules .DS_Store /sftp-config.json static + +vendor diff --git a/daux.phar b/daux.phar new file mode 100755 index 0000000000000000000000000000000000000000..7493b7581c0694ed31dc8fecf50cd34a633c4876 GIT binary patch literal 705436 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
    @@ -28,14 +28,14 @@ -
    +

    You are editing  Close

    - +
    From a35af5fd19d83fa810042c621297ddc00d3865f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 00:56:53 +0200 Subject: [PATCH 041/127] Remove the file editor --- README.md | 11 ---- docs/00_Getting_Started.md | 11 ---- docs/config.json | 1 - global.json | 1 - libs/Server/Server.php | 37 +------------- libs/Tree/Entry.php | 14 ------ resources/js/editor.js | 53 -------------------- resources/themes/_common/less/daux-base.less | 1 - resources/themes/_common/less/tools.less | 35 ------------- templates/content.php | 14 ------ templates/layout/00_layout.php | 2 - 11 files changed, 1 insertion(+), 179 deletions(-) delete mode 100644 resources/js/editor.js delete mode 100644 resources/themes/_common/less/tools.less diff --git a/README.md b/README.md index f29e248..338a8f5 100755 --- a/README.md +++ b/README.md @@ -170,17 +170,6 @@ Include custom links in the sidebar. } ``` -###File editor: -![File editor](https://f.cloud.github.com/assets/1788727/1954191/44358884-81d1-11e3-859d-254b9fb81808.png) - -Enable front-end Markdown editor. _Disabled by default_. - -```json -{ - "file_editor": true -} -``` - ###Google Analytics: This will embed the google analytics tracking code. diff --git a/docs/00_Getting_Started.md b/docs/00_Getting_Started.md index a5809ac..8ddeebe 100644 --- a/docs/00_Getting_Started.md +++ b/docs/00_Getting_Started.md @@ -181,17 +181,6 @@ Include custom links in the sidebar. } ``` -### File editor: -![File editor](https://f.cloud.github.com/assets/1788727/1954191/44358884-81d1-11e3-859d-254b9fb81808.png) - -Enable front-end Markdown editor. _Disabled by default_. - -```json -{ - "file_editor": true -} -``` - ### Google Analytics: This will embed the google analytics tracking code. diff --git a/docs/config.json b/docs/config.json index a2dfbef..c09beac 100644 --- a/docs/config.json +++ b/docs/config.json @@ -10,7 +10,6 @@ "breadcrumb_separator": "Chevrons", "date_modified": true, "float": true, - "file_editor": false, "repo": "justinwalsh/daux.io", "ignore": { "files": ["Work_In_Progress.md"], diff --git a/global.json b/global.json index d1b9c10..da50b16 100644 --- a/global.json +++ b/global.json @@ -23,7 +23,6 @@ "toggle_code": false, "date_modified": false, "float": false, - "file_editor": false, "timezone": "America/Los_Angeles", "google_analytics": false, diff --git a/libs/Server/Server.php b/libs/Server/Server.php index 2740339..80b9963 100644 --- a/libs/Server/Server.php +++ b/libs/Server/Server.php @@ -104,46 +104,11 @@ class Server $request = $this->getRequest(); $request = urldecode($request); - $request_type = isset($query['method']) ? $query['method'] : ''; if ($request == 'first_page') { $request = $this->daux->tree->getFirstPage()->getUri(); } - switch ($request_type) { - case 'DauxEdit': - if (!$this->daux->options['file_editor']) { - throw new Exception('Editing is currently disabled in config'); - } - - $content = isset($query['markdown']) ? $query['markdown'] : ''; - return $this->saveFile($request, $content); - - default: - return $this->getPage($request); - } - } - - /** - * @param string $request - * @param string $content - * @return SimplePage - * - * @throws Exception - * @throws NotFoundException - */ - private function saveFile($request, $content) - { - $file = $this->getFile($request); - - if ($file === false) { - throw new NotFoundException('The Page you requested is yet to be made. Try again later.'); - } - - if (!$file->write($content)) { - throw new Exception('The file you wish to write to is not writable.'); - } - - return new SimplePage('Success', 'Successfully Edited'); + return $this->getPage($request); } /** diff --git a/libs/Tree/Entry.php b/libs/Tree/Entry.php index 9815adf..d7f38d2 100644 --- a/libs/Tree/Entry.php +++ b/libs/Tree/Entry.php @@ -181,20 +181,6 @@ abstract class Entry $this->index_page = false; } - /** - * @param string $content - * @return bool - */ - public function write($content) - { - if (!is_writable($this->local_path)) { - return false; - } - - file_put_contents($this->local_path, $content); - return true; - } - /** * @return string */ diff --git a/resources/js/editor.js b/resources/js/editor.js deleted file mode 100644 index 9209d59..0000000 --- a/resources/js/editor.js +++ /dev/null @@ -1,53 +0,0 @@ -$(document).ready(function() { - var markdown_editor = $("#markdown_editor"), - save_editor = $(".save_editor"), - editor = $(".editor"); - - $("#editThis").click(function() { - editor.css({"display":"block"}); - markdown_editor.autosize().val(); - }); - - $(".closeEditor").click(function() { - editor.css({"display":"none"}); - }); - - save_editor.click(function() { - var original_text = save_editor.text(); - save_editor.text("Saving...").addClass("disabled"); - - $.post(window.location.href, {markdown: markdown_editor.val(), method: 'DauxEdit' }, function() { - save_editor.text("Done! Reloading page in 5 seconds. You can cancel it with ESC key"); - - var timeout = setTimeout(function() { - location.reload() - }, 5000); // lie - - $(document).keyup(function(e) { - if (e.keyCode == 27) { // esc key - clearTimeout(timeout); - save_editor.text("Page reload cancelled"); - setTimeout(function() { - save_editor.text(original_text).removeClass('disabled'); - }, 2000); - } - }); - }).fail(function() { - save_editor.removeClass('disabled').addClass("btn-danger").text("Failed :( - try checking your read/write permissions"); - setTimeout(function() { - save_editor.text(original_text).removeClass('btn-danger'); - },5000); - }); - }); -}); - - - - -/*! - Autosize v1.18.4 - 2014-01-11 - Automatically adjust textarea height based on user input. - (c) 2014 Jack Moore - http://www.jacklmoore.com/autosize - license: http://www.opensource.org/licenses/mit-license.php -*/ -!function(a){var b,c={className:"autosizejs",append:"",callback:!1,resizeDelay:10,placeholder:!0},d=' -
    -
    - diff --git a/templates/layout/00_layout.php b/templates/layout/00_layout.php index 19abf8f..d0d94dc 100644 --- a/templates/layout/00_layout.php +++ b/templates/layout/00_layout.php @@ -47,8 +47,6 @@ '; ?> - - '; ?> From ce109d042957c0fb30bfb54747441feb3d1fb805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 01:10:40 +0200 Subject: [PATCH 042/127] Cosmetic changes --- libs/Format/Confluence/Generator.php | 3 +-- libs/Format/Confluence/Publisher.php | 16 ++-------------- libs/Format/HTML/Generator.php | 4 ++-- 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/libs/Format/Confluence/Generator.php b/libs/Format/Confluence/Generator.php index dfe1209..0bf3f96 100644 --- a/libs/Format/Confluence/Generator.php +++ b/libs/Format/Confluence/Generator.php @@ -6,7 +6,6 @@ use Todaymade\Daux\Daux; use Todaymade\Daux\Format\Base\RunAction; use Todaymade\Daux\Tree\Content; use Todaymade\Daux\Tree\Directory; -use Todaymade\Daux\Tree\Entry; class Generator { @@ -45,7 +44,7 @@ class Generator $publisher->publish($tree); } - private function generateRecursive(Entry $tree, Config $params, $base_url = '') + private function generateRecursive(Directory $tree, Config $params, $base_url = '') { $final = ['title' => $this->prefix . $tree->getTitle()]; $params['base_url'] = $params['base_page'] = $base_url; diff --git a/libs/Format/Confluence/Publisher.php b/libs/Format/Confluence/Publisher.php index 7851aae..03e63df 100644 --- a/libs/Format/Confluence/Publisher.php +++ b/libs/Format/Confluence/Publisher.php @@ -97,30 +97,18 @@ class Publisher protected function createPage($parent_id, $entry, $published) { - if ($this->previous_title != "Creating") { - $this->previous_title = "Creating"; - echo "Creating Pages...\n"; - } - - echo "- " . $this->niceTitle($entry['file']->getUrl()); + echo "- " . $this->niceTitle($entry['file']->getUrl()) . "\n"; $published['version'] = 1; $published['id'] = $this->client->createPage($parent_id, $entry['title'], "The content will come very soon !"); - echo " √ \n"; return $published; } protected function createPlaceholderPage($parent_id, $entry, $published) { - if ($this->previous_title != "Creating Placeholder") { - $this->previous_title = "Creating Placeholder"; - echo "Creating Placeholder Pages...\n"; - } - - echo "- " . $entry['title']; + echo "- " . $entry['title'] . "\n"; $published['version'] = 1; $published['id'] = $this->client->createPage($parent_id, $entry['title'], ""); - echo " √ \n"; return $published; } diff --git a/libs/Format/HTML/Generator.php b/libs/Format/HTML/Generator.php index 14854ac..93ad39c 100644 --- a/libs/Format/HTML/Generator.php +++ b/libs/Format/HTML/Generator.php @@ -35,7 +35,7 @@ class Generator /** * Recursively generate the documentation * - * @param \Todaymade\Daux\Tree\Entry $tree + * @param Directory $tree * @param string $output_dir * @param \Todaymade\Daux\Config $params * @param OutputInterface $output @@ -43,7 +43,7 @@ class Generator * @param string $base_url * @throws \Exception */ - private function generateRecursive($tree, $output_dir, $params, $output, $width, $base_url = '') + private function generateRecursive(Directory $tree, $output_dir, $params, $output, $width, $base_url = '') { $params['base_url'] = $params['base_page'] = $base_url; From 71d1041cb8bd2f38edf182a2cd05b302d80a4e95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 01:14:44 +0200 Subject: [PATCH 043/127] Refactor getFirstPage --- libs/Tree/Entry.php | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/libs/Tree/Entry.php b/libs/Tree/Entry.php index d7f38d2..ad9f8eb 100644 --- a/libs/Tree/Entry.php +++ b/libs/Tree/Entry.php @@ -87,7 +87,7 @@ abstract class Entry } /** - * @return Content + * @return Content|false */ public function getFirstPage() { @@ -95,25 +95,29 @@ abstract class Entry return $this->first_page; } - if ($this instanceof Directory) { - foreach ($this->value as $node) { - if ($node instanceof Content) { - if (!count($node->getParents()) && $node->title == 'index') { - //the homepage should not count as first page - continue; - } + if (!$this instanceof Directory) { + return false; + } - $this->first_page = $node; - return $node; - } - } - foreach ($this->value as $node) { - if ($node instanceof Directory && $page = $node->getFirstPage()) { - $this->first_page = $page; - return $page; + foreach ($this->value as $node) { + if ($node instanceof Content) { + if (!count($node->getParents()) && $node->title == 'index') { + //the homepage should not count as first page + continue; } + + $this->first_page = $node; + return $node; } } + + foreach ($this->value as $node) { + if ($node instanceof Directory && $page = $node->getFirstPage()) { + $this->first_page = $page; + return $page; + } + } + return false; } From 9cdc9815ea495df6013c73d29c0524845a112a5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 14:01:16 +0200 Subject: [PATCH 044/127] Add a few checks --- libs/Generator/Helper.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libs/Generator/Helper.php b/libs/Generator/Helper.php index 5161f26..cdda5e2 100644 --- a/libs/Generator/Helper.php +++ b/libs/Generator/Helper.php @@ -10,8 +10,11 @@ class Helper */ public static function copyAssets($path, $local_base) { - mkdir($path); - static::rmdir($path); + if (is_dir($path)) { + static::rmdir($path); + } else { + mkdir($path); + } mkdir($path . DS . 'resources'); static::copyRecursive($local_base . DS . 'resources', $path . DS . 'resources'); @@ -46,8 +49,11 @@ class Helper */ private static function copyRecursive($source, $destination) { + if (!is_dir($destination)) { + mkdir($destination); + } + $dir = opendir($source); - mkdir($destination); while (false !== ($file = readdir($dir))) { if ($file != '.' && $file != '..') { if (is_dir($source . '/' . $file)) { From 3235c49acd9d52d0298f5a0c812eb1968ee314f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 14:37:18 +0200 Subject: [PATCH 045/127] Refactor to not use ->value in the tree --- libs/Daux.php | 4 ++-- libs/DauxHelper.php | 4 ++-- libs/Format/Confluence/Generator.php | 2 +- libs/Format/HTML/Generator.php | 2 +- libs/Format/HTML/Template.php | 13 +++++++------ libs/Server/Server.php | 2 +- libs/Tree/Builder.php | 28 +++++++++++++++------------- libs/Tree/Content.php | 7 ------- libs/Tree/Directory.php | 22 ++++++++++++++++++++-- libs/Tree/Entry.php | 10 ++++++---- libs/Tree/Raw.php | 6 ------ 11 files changed, 55 insertions(+), 45 deletions(-) diff --git a/libs/Daux.php b/libs/Daux.php index 4d578bc..01ca449 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -127,7 +127,7 @@ class Daux $this->tree = Builder::build($this->docs_path, $this->options['ignore'], $this->getParams()); if (!empty($this->options['languages'])) { foreach ($this->options['languages'] as $key => $node) { - $this->tree->value[$key]->title = $node; + $this->tree->getEntries()[$key]->title = $node; } } } @@ -155,7 +155,7 @@ class Daux $this->options['index'] = ($index = $this->tree->getIndexPage()) ? $index : $this->tree->getFirstPage(); if ($this->options['multilanguage']) { foreach ($this->options['languages'] as $key => $name) { - $this->options['entry_page'][$key] = $this->tree->value[$key]->getFirstPage(); + $this->options['entry_page'][$key] = $this->tree->getEntries()[$key]->getFirstPage(); } } else { $this->options['entry_page'] = $this->tree->getFirstPage(); diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index 6b6d0eb..a5b5623 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -113,8 +113,8 @@ class DauxHelper // if the node exists in the current request tree, // change the $tree variable to reference the new // node and proceed to the next url part - if (isset($tree->value[$node])) { - $tree = $tree->value[$node]; + if (isset($tree->getEntries()[$node])) { + $tree = $tree->getEntries()[$node]; continue; } diff --git a/libs/Format/Confluence/Generator.php b/libs/Format/Confluence/Generator.php index 0bf3f96..92eb90d 100644 --- a/libs/Format/Confluence/Generator.php +++ b/libs/Format/Confluence/Generator.php @@ -53,7 +53,7 @@ class Generator if ($base_url !== '') { $params['entry_page'] = $tree->getFirstPage(); } - foreach ($tree->value as $key => $node) { + foreach ($tree->getEntries() as $key => $node) { if ($node instanceof Directory) { $final['children'][$this->prefix . $node->getTitle()] = $this->generateRecursive( $node, diff --git a/libs/Format/HTML/Generator.php b/libs/Format/HTML/Generator.php index 93ad39c..6d3c019 100644 --- a/libs/Format/HTML/Generator.php +++ b/libs/Format/HTML/Generator.php @@ -54,7 +54,7 @@ class Generator if ($base_url !== '' && empty($params['entry_page'])) { $params['entry_page'] = $tree->getFirstPage(); } - foreach ($tree->value as $key => $node) { + foreach ($tree->getEntries() as $key => $node) { if ($node instanceof Directory) { $new_output_dir = $output_dir . DS . $key; mkdir($new_output_dir); diff --git a/libs/Format/HTML/Template.php b/libs/Format/HTML/Template.php index 501c3a5..62712c4 100644 --- a/libs/Format/HTML/Template.php +++ b/libs/Format/HTML/Template.php @@ -2,6 +2,8 @@ use League\Plates\Engine; use Todaymade\Daux\Daux; +use Todaymade\Daux\Tree\Content; +use Todaymade\Daux\Tree\Directory; class Template { @@ -88,13 +90,13 @@ class Template return ""; } - private function buildNavigation($tree, $path, $current_url, $base_page, $mode) + private function buildNavigation(Directory $tree, $path, $current_url, $base_page, $mode) { $nav = []; - foreach ($tree->value as $node) { + foreach ($tree->getEntries() as $node) { $url = $node->getUri(); - if ($node instanceof \Todaymade\Daux\Tree\Content) { - if ($node->value === 'index') { + if ($node instanceof Content) { + if ($node->getName() === '_index') { continue; } @@ -105,8 +107,7 @@ class Template 'href' => $base_page . $link, 'class' => ($current_url === $link) ? 'active' : '' ]; - } - if ($node instanceof \Todaymade\Daux\Tree\Directory) { + } else if ($node instanceof Directory) { $link = ($path === '') ? $url : $path . '/' . $url; $folder = [ diff --git a/libs/Server/Server.php b/libs/Server/Server.php index 80b9963..1469b69 100644 --- a/libs/Server/Server.php +++ b/libs/Server/Server.php @@ -130,7 +130,7 @@ class Server $params = $this->params; $params['request'] = $request; - $params['file_uri'] = $file->value; + $params['file_uri'] = $file->getUri(); if ($request !== 'index') { $params['entry_page'] = $file->getFirstPage(); } diff --git a/libs/Tree/Builder.php b/libs/Tree/Builder.php index c4657f8..2e5e6e7 100644 --- a/libs/Tree/Builder.php +++ b/libs/Tree/Builder.php @@ -57,14 +57,14 @@ class Builder } if ($entry instanceof Entry) { - $node->value[$entry->getUri()] = $entry; + $node->addChild($entry); } } $node->sort(); - if (isset($node->value[$params['index_key']])) { - $node->value[$params['index_key']]->setFirstPage($node->getFirstPage()); - $node->setIndexPage($node->value[$params['index_key']]); + if (isset($node->getEntries()[$params['index_key']])) { + $node->getEntries()[$params['index_key']]->setFirstPage($node->getFirstPage()); + $node->setIndexPage($node->getEntries()[$params['index_key']]); } else { $node->setIndexPage(false); } @@ -72,22 +72,22 @@ class Builder } /** - * @param Entry $parent + * @param Directory $parent * @param String $title * @return Directory */ - public static function getOrCreateDir($parent, $title) + public static function getOrCreateDir(Directory $parent, $title) { $slug = DauxHelper::slug($title); - if (array_key_exists($slug, $parent->value)) { - return $parent->value[$slug]; + if (array_key_exists($slug, $parent->getEntries())) { + return $parent->getEntries()[$slug]; } $dir = new Directory(); $dir->setTitle($title); $dir->setUri($slug); - $parent->value[$slug] = $dir; + $parent->addChild($dir); return $dir; } @@ -102,10 +102,13 @@ class Builder $slug = DauxHelper::slug($title); $uri = $slug . ".html"; + /** + * @var Directory $nearestParent + */ $nearestParent = end($parents); - if (array_key_exists($uri, $nearestParent->value)) { - return $nearestParent->value[$uri]; + if (array_key_exists($uri, $nearestParent->getEntries())) { + return $nearestParent->getEntries()[$uri]; } $page = new Content('', $parents); @@ -115,14 +118,13 @@ class Builder if ($title == 'index') { $page->setName('_index'); $page->setTitle($nearestParent->getTitle()); - $page->value = 'index'; $nearestParent->setIndexPage($page); } else { $page->setName($slug); $page->setTitle($title); } - $nearestParent->value[$uri] = $page; + $nearestParent->addChild($page); return $page; } diff --git a/libs/Tree/Content.php b/libs/Tree/Content.php index fc73b19..420733a 100644 --- a/libs/Tree/Content.php +++ b/libs/Tree/Content.php @@ -9,13 +9,6 @@ class Content extends Entry */ protected $content; - public function __construct($path = '', $parents = array()) - { - parent::__construct($path, $parents); - - $this->value = $this->uri; - } - /** * @return string */ diff --git a/libs/Tree/Directory.php b/libs/Tree/Directory.php index 9d128e3..9a1694d 100644 --- a/libs/Tree/Directory.php +++ b/libs/Tree/Directory.php @@ -2,11 +2,29 @@ class Directory extends Entry { - public $value = []; + protected $children = []; public function sort() { - uasort($this->value, array($this, 'compareEntries')); + uasort($this->children, array($this, 'compareEntries')); + } + + public function getEntries() + { + return $this->children; + } + + public function addChild(Entry $entry) + { + //TODO :: set parent in the entry + //TODO :: remove child from previous parent + + $this->children[$entry->getUri()] = $entry; + } + + public function removeChild(Entry $entry) + { + unset($this->children[$entry->getUri()]); } private function compareEntries($a, $b) diff --git a/libs/Tree/Entry.php b/libs/Tree/Entry.php index ad9f8eb..15db34b 100644 --- a/libs/Tree/Entry.php +++ b/libs/Tree/Entry.php @@ -99,21 +99,23 @@ abstract class Entry return false; } - foreach ($this->value as $node) { + // First we try to find a real page + foreach ($this->getEntries() as $node) { if ($node instanceof Content) { if (!count($node->getParents()) && $node->title == 'index') { //the homepage should not count as first page continue; } - $this->first_page = $node; + $this->setFirstPage($node); return $node; } } - foreach ($this->value as $node) { + // If we can't find one we check in the sub-directories + foreach ($this->getEntries() as $node) { if ($node instanceof Directory && $page = $node->getFirstPage()) { - $this->first_page = $page; + $this->setFirstPage($page); return $page; } } diff --git a/libs/Tree/Raw.php b/libs/Tree/Raw.php index 50e1016..37bacd0 100644 --- a/libs/Tree/Raw.php +++ b/libs/Tree/Raw.php @@ -2,10 +2,4 @@ class Raw extends Entry { - public function __construct($path = '', $parents = array()) - { - parent::__construct($path, $parents); - - $this->value = $this->uri; - } } From aa5602a0fbcb7b8dad44ee2cbda55b9bf009713e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 20:52:14 +0200 Subject: [PATCH 046/127] Refactor the tree system Each element of the tree now only has one parent, not a parent array. - Creating an elements doesn't necessarily rely on an existing file - Moving elements unregisters elements from the previous parent - Moved some helpers to the builder instead of Entry --- libs/Daux.php | 5 +- libs/Format/HTML/MarkdownPage.php | 3 +- libs/Format/HTML/Template.php | 2 +- libs/Tree/Builder.php | 152 ++++++++++++++++++++--------- libs/Tree/Directory.php | 14 ++- libs/Tree/Entry.php | 153 ++++++++++++++---------------- libs/Tree/Root.php | 15 +++ 7 files changed, 210 insertions(+), 134 deletions(-) create mode 100644 libs/Tree/Root.php diff --git a/libs/Daux.php b/libs/Daux.php index 01ca449..56f02c9 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -2,6 +2,7 @@ use Symfony\Component\Console\Output\NullOutput; use Todaymade\Daux\Tree\Builder; +use Todaymade\Daux\Tree\Root; class Daux { @@ -124,7 +125,9 @@ class Daux private function generateTree() { - $this->tree = Builder::build($this->docs_path, $this->options['ignore'], $this->getParams()); + $this->tree = new Root($this->docs_path); + Builder::build($this->tree, $this->options['ignore'], $this->getParams()); + if (!empty($this->options['languages'])) { foreach ($this->options['languages'] as $key => $node) { $this->tree->getEntries()[$key]->title = $node; diff --git a/libs/Format/HTML/MarkdownPage.php b/libs/Format/HTML/MarkdownPage.php index 5d4150c..3a43d25 100644 --- a/libs/Format/HTML/MarkdownPage.php +++ b/libs/Format/HTML/MarkdownPage.php @@ -11,8 +11,7 @@ class MarkdownPage extends \Todaymade\Daux\Format\Base\MarkdownPage if ($this->title === 'index') { $minimum_parent_dir_size = ($this->params['multilanguage']) ? 2 : 1; if (count($this->file->getParents()) >= $minimum_parent_dir_size) { - $parents = $this->file->getParents(); - $this->title = end($parents)->getTitle(); + $this->title = $this->file->getParent()->getTitle(); } else { $this->homepage = ($this->file->getName() === '_index'); $this->title = $this->params['title']; diff --git a/libs/Format/HTML/Template.php b/libs/Format/HTML/Template.php index 62712c4..ef27ab0 100644 --- a/libs/Format/HTML/Template.php +++ b/libs/Format/HTML/Template.php @@ -107,7 +107,7 @@ class Template 'href' => $base_page . $link, 'class' => ($current_url === $link) ? 'active' : '' ]; - } else if ($node instanceof Directory) { + } elseif ($node instanceof Directory) { $link = ($path === '') ? $url : $path . '/' . $url; $folder = [ diff --git a/libs/Tree/Builder.php b/libs/Tree/Builder.php index 2e5e6e7..94713d5 100644 --- a/libs/Tree/Builder.php +++ b/libs/Tree/Builder.php @@ -1,5 +1,6 @@ getPath())) { return; } - $node = new Directory($dir, $parents); - - $new_parents = $parents; - if (is_null($new_parents)) { - $new_parents = array(); - } else { - $new_parents[] = $node; + if ($node instanceof Root) { + // Ignore config.json in the root directory + $ignore['files'][] = 'config.json'; } while (($file = readdir($dh)) !== false) { @@ -34,7 +29,7 @@ class Builder continue; } - $path = $dir . DS . $file; + $path = $node->getPath() . DS . $file; if (is_dir($path) && in_array($file, $ignore['folders'])) { continue; @@ -45,19 +40,12 @@ class Builder $entry = null; if (is_dir($path)) { - $entry = static::build($path, $ignore, $params, $new_parents); - } elseif (in_array(pathinfo($path, PATHINFO_EXTENSION), Daux::$VALID_MARKDOWN_EXTENSIONS)) { - $entry = new Content($path, $new_parents); - - if ($params['mode'] === Daux::STATIC_MODE) { - $entry->setUri($entry->getUri() . '.html'); - } + $new = new Directory($node, static::getUriFromFilename(static::getFilename($path)), $path); + $new->setName(DauxHelper::pathinfo($path)['filename']); + $new->setTitle(static::getTitleFromFilename($new->getName())); + static::build($new, $ignore, $params); } else { - $entry = new Raw($path, $new_parents); - } - - if ($entry instanceof Entry) { - $node->addChild($entry); + static::createContent($node, $path, $params); } } @@ -68,7 +56,91 @@ class Builder } else { $node->setIndexPage(false); } - return $node; + } + + /** + * @param Directory $parent + * @param string $path + * @param Config $params + * @return Content|Raw + */ + public static function createContent(Directory $parent, $path, Config $params) + { + $name = DauxHelper::pathinfo($path)['filename']; + + if (in_array(pathinfo($path, PATHINFO_EXTENSION), Daux::$VALID_MARKDOWN_EXTENSIONS)) { + $uri = static::getUriFromFilename($name); + if ($params['mode'] === Daux::STATIC_MODE) { + $uri .= '.html'; + } + + $entry = new Content($parent, $uri, $path, filemtime($path)); + } else { + $entry = new Raw($parent, static::getUriFromFilename(static::getFilename($path)), $path, filemtime($path)); + } + + if ($entry->getUri() == $params['index_key']) { + if ($parent instanceof Root) { + $entry->setTitle($params['title']); + } else { + $entry->setTitle($parent->getTitle()); + } + } else { + $entry->setTitle(static::getTitleFromFilename($name)); + } + + $entry->setIndexPage(false); + $entry->setName($name); + + return $entry; + } + + /** + * @param string $file + * @return string + */ + protected static function getFilename($file) + { + $parts = explode('/', $file); + return end($parts); + } + + /** + * @param string $filename + * @return string + */ + protected static function getTitleFromFilename($filename) + { + $filename = explode('_', $filename); + if ($filename[0] == '' || is_numeric($filename[0])) { + unset($filename[0]); + } else { + $t = $filename[0]; + if ($t[0] == '-') { + $filename[0] = substr($t, 1); + } + } + $filename = implode(' ', $filename); + return $filename; + } + + /** + * @param string $filename + * @return string + */ + protected static function getUriFromFilename($filename) + { + $filename = explode('_', $filename); + if ($filename[0] == '' || is_numeric($filename[0])) { + unset($filename[0]); + } else { + $t = $filename[0]; + if ($t[0] == '-') { + $filename[0] = substr($t, 1); + } + } + $filename = implode('_', $filename); + return $filename; } /** @@ -84,48 +156,38 @@ class Builder return $parent->getEntries()[$slug]; } - $dir = new Directory(); + $dir = new Directory($parent, $slug); $dir->setTitle($title); - $dir->setUri($slug); - $parent->addChild($dir); return $dir; } /** - * @param array $parents + * @param Directory $parent * @param string $title * @return Content */ - public static function getOrCreatePage($parents, $title) + public static function getOrCreatePage(Directory $parent, $title) { $slug = DauxHelper::slug($title); $uri = $slug . ".html"; - /** - * @var Directory $nearestParent - */ - $nearestParent = end($parents); - - if (array_key_exists($uri, $nearestParent->getEntries())) { - return $nearestParent->getEntries()[$uri]; + if (array_key_exists($uri, $parent->getEntries())) { + return $parent->getEntries()[$uri]; } - $page = new Content('', $parents); - $page->setUri($uri); + $page = new Content($parent, $uri); $page->setContent("-"); //set an almost empty content to avoid problems if ($title == 'index') { $page->setName('_index'); - $page->setTitle($nearestParent->getTitle()); - $nearestParent->setIndexPage($page); + $page->setTitle($parent->getTitle()); + $parent->setIndexPage($page); } else { $page->setName($slug); $page->setTitle($title); } - $nearestParent->addChild($page); - return $page; } } diff --git a/libs/Tree/Directory.php b/libs/Tree/Directory.php index 9a1694d..1ad0f1d 100644 --- a/libs/Tree/Directory.php +++ b/libs/Tree/Directory.php @@ -16,9 +16,6 @@ class Directory extends Entry public function addChild(Entry $entry) { - //TODO :: set parent in the entry - //TODO :: remove child from previous parent - $this->children[$entry->getUri()] = $entry; } @@ -71,4 +68,15 @@ class Directory extends Entry } } } + + public function dump() + { + $dump = parent::dump(); + + foreach ($this->getEntries() as $entry) { + $dump['children'][] = $entry->dump(); + } + + return $dump; + } } diff --git a/libs/Tree/Entry.php b/libs/Tree/Entry.php index 15db34b..d922dc9 100644 --- a/libs/Tree/Entry.php +++ b/libs/Tree/Entry.php @@ -1,7 +1,5 @@ setPath($path); - $this->setParents($parents); + $this->setUri($uri); + $this->setParent($parent); + + if ($path) { + $this->path = $path; + } + + if ($last_modified) { + $this->last_modified = $last_modified; + } } /** @@ -67,7 +75,15 @@ abstract class Entry */ public function setUri($uri) { + if ($this->parent) { + $this->parent->removeChild($this); + } + $this->uri = $uri; + + if ($this->parent) { + $this->parent->addChild($this); + } } /** @@ -102,7 +118,7 @@ abstract class Entry // First we try to find a real page foreach ($this->getEntries() as $node) { if ($node instanceof Content) { - if (!count($node->getParents()) && $node->title == 'index') { + if (!$node->getParent() && $node->title == 'index') { //the homepage should not count as first page continue; } @@ -148,19 +164,40 @@ abstract class Entry } /** - * @return array + * @return Directory */ - public function getParents() + public function getParent() { - return $this->parents; + return $this->parent; } /** - * @param array $parents + * Return all parents starting with the root + * + * @return array */ - public function setParents($parents) + public function getParents() { - $this->parents = $parents; + $parents = []; + if ($this->parent && !$this->parent instanceof Root) { + $parents = $this->parent->getParents(); + $parents[] = $this->parent; + } + + return $parents; + } + + /** + * @param Directory $parent + */ + protected function setParent(Directory $parent) + { + if ($this->parent) { + $this->parent->removeChild($this); + } + + $parent->addChild($this); + $this->parent = $parent; } /** @@ -168,23 +205,7 @@ abstract class Entry */ public function getPath() { - return $this->local_path; - } - - /** - * @param string $path - */ - public function setPath($path) - { - if (!isset($path) || $path == '' || !file_exists($path)) { - return; - } - $this->local_path = $path; - $this->last_modified = filemtime($path); - $this->name = DauxHelper::pathinfo($path)['filename']; - $this->title = $this->getTitleInternal($this->name); - $this->uri = $this->getUrlInternal($this->getFilename($path)); - $this->index_page = false; + return $this->path; } /** @@ -193,58 +214,26 @@ abstract class Entry public function getUrl() { $url = ''; - foreach ($this->parents as $node) { - $url .= $node->uri . '/'; + + if ($this->getParent() && !$this->getParent() instanceof Root) { + $url = $this->getParent()->getUrl() . '/' . $url; } - $url .= $this->uri; + + $url .= $this->getUri(); return $url; } - /** - * @param string $file - * @return string - */ - protected function getFilename($file) + public function dump() { - $parts = explode('/', $file); - return end($parts); - } - - /** - * @param string $filename - * @return string - */ - protected function getTitleInternal($filename) - { - $filename = explode('_', $filename); - if ($filename[0] == '' || is_numeric($filename[0])) { - unset($filename[0]); - } else { - $t = $filename[0]; - if ($t[0] == '-') { - $filename[0] = substr($t, 1); - } - } - $filename = implode(' ', $filename); - return $filename; - } - - /** - * @param string $filename - * @return string - */ - protected function getUrlInternal($filename) - { - $filename = explode('_', $filename); - if ($filename[0] == '' || is_numeric($filename[0])) { - unset($filename[0]); - } else { - $t = $filename[0]; - if ($t[0] == '-') { - $filename[0] = substr($t, 1); - } - } - $filename = implode('_', $filename); - return $filename; + return [ + 'title' => $this->getTitle(), + 'type' => get_class($this), + 'name' => $this->getName(), + 'uri' => $this->getUri(), + 'url' => $this->getUrl(), + 'index' => $this->getIndexPage()? $this->getIndexPage()->getUrl() : '', + 'first' => $this->getFirstPage() ? $this->getFirstPage()->getUrl() : '', + 'path' => $this->path + ]; } } diff --git a/libs/Tree/Root.php b/libs/Tree/Root.php new file mode 100644 index 0000000..6aae9d7 --- /dev/null +++ b/libs/Tree/Root.php @@ -0,0 +1,15 @@ +setUri($uri); + $this->path = $uri; + } +} From 7dc7c045d4dba9cb5217be12659c82aa822cb8cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 21:23:02 +0200 Subject: [PATCH 047/127] Bugfixes --- daux.phar | Bin 713814 -> 712710 bytes generate.php => generate | 1 + libs/Compiler.php | 8 ++++---- libs/DauxHelper.php | 2 +- libs/Format/HTML/MarkdownPage.php | 10 +++++++--- libs/Generator/Helper.php | 4 ++-- libs/Server/Server.php | 1 - libs/Tree/Builder.php | 1 - libs/Tree/Entry.php | 11 ++++++----- libs/Tree/Root.php | 2 +- 10 files changed, 22 insertions(+), 18 deletions(-) rename generate.php => generate (99%) mode change 100644 => 100755 diff --git a/daux.phar b/daux.phar index f903c1b349c35f77e75574648f3f8505a9a6cbf0..d247e8bab9583e83df59e3f6b25d35de331c37df 100755 GIT binary patch delta 10989 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 z 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 diff --git a/generate.php b/generate old mode 100644 new mode 100755 similarity index 99% rename from generate.php rename to generate index 89cfdd2..146dd5b --- a/generate.php +++ b/generate @@ -1,3 +1,4 @@ +#!/usr/bin/env php addFromString('generate.php', $content); + $content = file_get_contents(__DIR__ . '/../generate'); + $content = preg_replace('{^#!/usr/bin/env php\s*}', '', $content); + $phar->addFromString('generate', $content); } /** @@ -166,7 +166,7 @@ define('PHAR_DIR', dirname(__FILE__)); Phar::mapPhar('daux.phar'); -require 'phar://daux.phar/generate.php'; +require 'phar://daux.phar/generate'; __HALT_COMPILER(); EOF; diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index a5b5623..49f0a59 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -98,7 +98,7 @@ class DauxHelper * * @param Directory $tree * @param string $request - * @return Tree\Entry|false + * @return Tree\Content|Tree\Raw */ public static function getFile($tree, $request) { diff --git a/libs/Format/HTML/MarkdownPage.php b/libs/Format/HTML/MarkdownPage.php index 3a43d25..fa0faef 100644 --- a/libs/Format/HTML/MarkdownPage.php +++ b/libs/Format/HTML/MarkdownPage.php @@ -20,12 +20,16 @@ class MarkdownPage extends \Todaymade\Daux\Format\Base\MarkdownPage $this->language = ''; if ($this->params['multilanguage'] && count($this->file->getParents())) { - reset($this->file->getParents()); - $language_dir = current($this->file->getParents()); - $this->language = $language_dir->name; + $language_dir = $this->file->getParents()[0]; + $this->language = $language_dir->getName(); } } + /** + * @param \Todaymade\Daux\Tree\Directory[] $parents + * @param bool $multilanguage + * @return array + */ private function getBreadcrumbTrail($parents, $multilanguage) { if ($multilanguage && !empty($parents)) { diff --git a/libs/Generator/Helper.php b/libs/Generator/Helper.php index cdda5e2..167dead 100644 --- a/libs/Generator/Helper.php +++ b/libs/Generator/Helper.php @@ -25,7 +25,7 @@ class Helper * * @param string $dir */ - private static function rmdir($dir) + protected static function rmdir($dir) { $it = new \RecursiveDirectoryIterator($dir); $files = new \RecursiveIteratorIterator($it, \RecursiveIteratorIterator::CHILD_FIRST); @@ -47,7 +47,7 @@ class Helper * @param string $source * @param string $destination */ - private static function copyRecursive($source, $destination) + protected static function copyRecursive($source, $destination) { if (!is_dir($destination)) { mkdir($destination); diff --git a/libs/Server/Server.php b/libs/Server/Server.php index 1469b69..5007182 100644 --- a/libs/Server/Server.php +++ b/libs/Server/Server.php @@ -5,7 +5,6 @@ use Todaymade\Daux\DauxHelper; use Todaymade\Daux\Exception; use Todaymade\Daux\Format\HTML\MarkdownPage; use Todaymade\Daux\Format\HTML\RawPage; -use Todaymade\Daux\Format\HTML\SimplePage; use Todaymade\Daux\Tree\Raw; class Server diff --git a/libs/Tree/Builder.php b/libs/Tree/Builder.php index 94713d5..e4f0225 100644 --- a/libs/Tree/Builder.php +++ b/libs/Tree/Builder.php @@ -38,7 +38,6 @@ class Builder continue; } - $entry = null; if (is_dir($path)) { $new = new Directory($node, static::getUriFromFilename(static::getFilename($path)), $path); $new->setName(DauxHelper::pathinfo($path)['filename']); diff --git a/libs/Tree/Entry.php b/libs/Tree/Entry.php index d922dc9..5c23919 100644 --- a/libs/Tree/Entry.php +++ b/libs/Tree/Entry.php @@ -37,11 +37,11 @@ abstract class Entry $this->setUri($uri); $this->setParent($parent); - if ($path) { + if ($path !== null) { $this->path = $path; } - if ($last_modified) { + if ($last_modified !== null) { $this->last_modified = $last_modified; } } @@ -118,7 +118,8 @@ abstract class Entry // First we try to find a real page foreach ($this->getEntries() as $node) { if ($node instanceof Content) { - if (!$node->getParent() && $node->title == 'index') { + // TODO :: this condition looks weird ... + if (!$node->getParent() && $node->getTitle() == 'index') { //the homepage should not count as first page continue; } @@ -174,7 +175,7 @@ abstract class Entry /** * Return all parents starting with the root * - * @return array + * @return Directory[] */ public function getParents() { @@ -231,7 +232,7 @@ abstract class Entry 'name' => $this->getName(), 'uri' => $this->getUri(), 'url' => $this->getUrl(), - 'index' => $this->getIndexPage()? $this->getIndexPage()->getUrl() : '', + 'index' => $this->getIndexPage() ? $this->getIndexPage()->getUrl() : '', 'first' => $this->getFirstPage() ? $this->getFirstPage()->getUrl() : '', 'path' => $this->path ]; diff --git a/libs/Tree/Root.php b/libs/Tree/Root.php index 6aae9d7..92eec5c 100644 --- a/libs/Tree/Root.php +++ b/libs/Tree/Root.php @@ -5,7 +5,7 @@ class Root extends Directory /** * The root doesn't have a parent * - * @param Directory $uri + * @param string $uri */ public function __construct($uri) { From 667747a610d6f39201796434b6ca89da1cd2dd26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 21:37:27 +0200 Subject: [PATCH 048/127] Composer update --- composer.lock | 24 ++++++++++++------------ daux.phar | Bin 712710 -> 712625 bytes 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/composer.lock b/composer.lock index bd3d968..7c72cf1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "da1775dfe76954e5e731cba81179b910", + "hash": "7cb7ddabbb3aaa33e7504afc4c7150b9", "packages": [ { "name": "guzzlehttp/guzzle", @@ -228,16 +228,16 @@ }, { "name": "league/plates", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/thephpleague/plates.git", - "reference": "c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8" + "reference": "2d8569e9f140a70d6a05db38006926f7547cb802" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/plates/zipball/c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8", - "reference": "c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8", + "url": "https://api.github.com/repos/thephpleague/plates/zipball/2d8569e9f140a70d6a05db38006926f7547cb802", + "reference": "2d8569e9f140a70d6a05db38006926f7547cb802", "shasum": "" }, "require-dev": { @@ -276,20 +276,20 @@ "templating", "views" ], - "time": "2014-10-21 12:06:12" + "time": "2015-07-09 02:14:40" }, { "name": "react/promise", - "version": "v2.2.0", + "version": "v2.2.1", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "365fcee430dfa4ace1fbc75737ca60ceea7eeeef" + "reference": "3b6fca09c7d56321057fa8867c8dbe1abf648627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/365fcee430dfa4ace1fbc75737ca60ceea7eeeef", - "reference": "365fcee430dfa4ace1fbc75737ca60ceea7eeeef", + "url": "https://api.github.com/repos/reactphp/promise/zipball/3b6fca09c7d56321057fa8867c8dbe1abf648627", + "reference": "3b6fca09c7d56321057fa8867c8dbe1abf648627", "shasum": "" }, "require": { @@ -316,11 +316,11 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@googlemail.com" + "email": "jsorgalla@gmail.com" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "time": "2014-12-30 13:32:42" + "time": "2015-07-03 13:48:55" }, { "name": "symfony/console", diff --git a/daux.phar b/daux.phar index d247e8bab9583e83df59e3f6b25d35de331c37df..9f24c514ae2c6bfc009c2b339920884a05af4b49 100755 GIT binary patch delta 4803 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 H1)2W^KSx4A delta 4836 zcmZu!2~d(-7!El^u2C)lxo;E(7+_>L1iX!rH9-?2Dy_DO zibt|0F_>sl>$n@@5kr#FXpFi!%6R2)%iYAIc1>bwlI{0?Hk!&>_50D?@4f!|>-S#6 zp<@w)$0H8DCXo*BqX#6B0AEU`0uX5uz$|G3zzS(5z%gk$hhe)67#QvJ0G)QB09)n}M;a0f zYo!Fww}DJmF=ug0z&Od_6ndKIR3|4U0Y@6z;^{*Y0)9b?7=TKJe$p#M^aH%!`!*d? z1j5pr3f%6R0u>KbroyC2ISb%rWiG&75mKB{o#oC(m^|iO3E=568=%<*RXyS|2S)Nq zC~o~E9F0!Gn|dIQ@>Myg>bO)8&M&!CPw%J<^sGt^em7Lb07GkFohsZt>8Z)?5bf$@JYa+xVX?XdCQqp`L!3Rc(Dx^PmhdUs zTfh0P^+eyDp6GPb6LU1i3q@V*l?5S=dV%1>-pG8mH=g(fZ?wPRod*^%KIpbogcClP zD-V1`x+y&2f<8B{q&k-%ddycwm-(uZO9Riq2gWltddC|U{2hq2t zszv;fLAgJki1`;_l$Uw<6_wRix+w?LP*FDx=2Nl;Lkwu9L)>>XNZUC8M|lCbwkZJF ze;FX&^D$pRSn0WK36->okxI2%+~T5xAdG(ZQVSB@qeY^}v^fx0u0t~UI+TOyP_QdH z#3Wd&5`>HT4JvwPhK8Pt zP|{z69q4G#WQ^g@C7XN1(Sh#PhvUM-AY|hcT!rgKzJ4I`+5@^LG@6bE`$OQt;4#i;U zVF(+-(B#{&8gR(a<7lhC0!H8Kn*d6}u{8FD zWUziEVjh5eDsI*&!jY+{xFoU^eSeuG2x>*CnVOX*}Y`0?x$oiKAw49TOFe1XO#4_aA$Zze^H0CqG(SVcT zoW&1y%l7k>52x=ZiNa;^(>y)?%GEVThMGR&#nC(Crf!Li2n1Z2ZGtqbdkwCz8-t!rzK)JPJ^Yy6l~)gMYx%Q z2S}bFmev+-FCBCq6zw(i%nVQPxiJH+5>hcw)}@No6~L?Oy|35}Y6#NMt7%H=l;(-7 zBs?=uI;d7pq(cORu%=y zLD^Ve3E9{J)@Ng*zn(2t>;NbJ;ogeBV8t4$)%19_8(o@%C9)<5O)ur3FiE+1Nt<%< zk-eRZm!6l0@M0cLN@k-;?d)10dU$pn9(jmw5xw=hOPowJ-JLI^W%+pIwtO@@nUB7@ zf=0Bi;np7vyy#08`f|xEq~^w7h$?mBJzCu6 zL+=z#q9dgW0tK7phsE7die2hNDKZTx!x-IVsL6+AsHI=Imv^5nb5Ohq0fXcZrT3Lzl&sK_UxsNAcQO@9AdZsGLCAYuR z3dFkkBscA?!t6L%H3!e3<=Jt;xHxO#&f_6kYc+0oq#A?DYjBIU8svUl1n*i@qpKEG zJY6fM+UK0GkehmmW@PK>@p>0(uJeF^%j>FfGl9Rp&ncSZv~iBOuCDjTg$jPr?U5J0 z=Y7JRj?Cnl$DJ3|<2$sz9#i9HJtltUTx7F*uGnA}aL3X;CqAGHY78`E9=^2=^N`fo zJk(3w&;%5gHHZ|a@O=2iW&9k^2cRJ1PEJ(a=m|E_jkwdg#u_Bm#icpFO!@@I)|xPO zx(PMeV8VWUMI1#nVfhU-VedH8gaT`t5xSev@~8;TEvRfm3+CBq3p)HH!Yp&LYIx$8 zZotbc1qIKp5L(nq=$P3V7@jtx?Alf_2}gM5Bt>=B^1c*BM_T3HDn0>!UjSabIc@xZ ze_uq?Jv`7ityug&w&tloH!uWrt}DLCH<|$(47K6={#hG7uKw-V*xK7OR0`fR!2$5a zg6&4^ou}JFRde}E2n&FwC%?T0t(it!-Ds#K2qG3(;4d_~-hy&mvCLGl36g-sTwTE5 zkXY40{w6^fz)o@`3FGhVaHHGidxQU5^V3vkdHR42;GVr7%c-QppnB*cP6Box*ms;) zQ7SmB>cC!ms>7%n< z87Omd=vrvCrm*51iP|>QCRyqyNoRLgOVn!uo|5oS%0D~)+4IkVe~$c<@lS3Gc*-f> z#wt=spjQeB?r*pBMW(fw`c2wYZI^kmb{7AU#oUnk+YY9XC2B97rLO_D3JdNxclKCK z{bs$^)YYP8ni3LaGnJAGDI;Y>V>?z(hFw{4EAe9;tt5~=*GiHJc|vQp_L;TI3Cn0E zKJ23+;==B=l2VD;mfJ=uC6A_UTVH>lOPCIr< zW9Lc_{wQM^JtTn5>miLn#M0GlUD#sgl<{;urvCOYy*}mfu#ea{EFhcNwgu#UHn*1q zxRUOs26II&mdBE!KrnToB~Np3t?wf{@F$zGpEOI^ON&T6i&;!O z*{wxH%bXXJ5E$zJukmh1Hd zVaGQT59vZPJMpf>n`s85PHbqDyuk_wh&x;PC-VB%r-_<~cLO`J%pEdMTlQ)~B>!)P z8MYCHZQ)boI+18?l^e(>jx6q?%#D3KO6IZ4TZp&qjjiOWJsW6}#j%sy$v;@fa^fNH z>FsXoHTU(|_U|Av2|KWr#IYMYd8R5y$hZUJ|0mnrULq@{uH0&&wI5{QKAo06GmGh$ zxl7tv&_1Fg;wqesy|$0UvK^r^jqUQwB+lL*RAerr{GMMOB$HY3e3_%7*KF$R?m{7K z#!<3L${Ke~tT~EnOwwlO!MgYGQ+@k7$&);CW~qmG`M`M@KW~U_$wA^D?bp5Q-TxeV bCTUH4#b;jK?@0#s=Ow+vpA#X+SZMq&HeTo% From e87c86d9aa6e99be0189029a41082d64345d4837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 21:45:38 +0200 Subject: [PATCH 049/127] Added documentation --- libs/Daux.php | 41 +++++++++++++++++++++++++++++++---------- libs/DauxHelper.php | 2 +- libs/Tree/Directory.php | 3 +++ 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/libs/Daux.php b/libs/Daux.php index 56f02c9..1c7a38f 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -9,33 +9,42 @@ class Daux const STATIC_MODE = 'DAUX_STATIC'; const LIVE_MODE = 'DAUX_LIVE'; + /** @var string[] */ public static $VALID_MARKDOWN_EXTENSIONS; + + /** @var string */ public $local_base; + + /** @var string */ public $internal_base; + + /** @var string */ private $docs_path; - /** - * @var Processor - */ + /** @var Processor */ protected $processor; - /** - * @var Tree\Directory - */ + /** @var Tree\Root */ public $tree; - /** - * @var Config - */ + /** @var Config */ public $options; + + /** @var string */ private $mode; + /** + * @param string $mode + */ public function __construct($mode) { $this->mode = $mode; $this->local_base = $this->internal_base = dirname(__DIR__); + // In case we're inside the phar archive + // we save the path to the directory + // in which it is contained if (defined('PHAR_DIR')) { $this->local_base = PHAR_DIR; } @@ -46,6 +55,10 @@ class Daux define("DS", DIRECTORY_SEPARATOR); } + /** + * @param string $override_file + * @throws Exception + */ public function initialize($override_file = 'config.json') { //global.json (docs dir, markdown files) @@ -57,6 +70,11 @@ class Daux $this->generateTree(); } + /** + * Load and validate the global configuration + * + * @throws Exception + */ private function loadConfig() { $default_config = [ @@ -123,6 +141,9 @@ class Daux } } + /** + * Generate the tree that will be used + */ private function generateTree() { $this->tree = new Root($this->docs_path); @@ -130,7 +151,7 @@ class Daux if (!empty($this->options['languages'])) { foreach ($this->options['languages'] as $key => $node) { - $this->tree->getEntries()[$key]->title = $node; + $this->tree->getEntries()[$key]->setTitle($node); } } } diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index 49f0a59..d8bc911 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -98,7 +98,7 @@ class DauxHelper * * @param Directory $tree * @param string $request - * @return Tree\Content|Tree\Raw + * @return Tree\Content|Tree\Raw|false */ public static function getFile($tree, $request) { diff --git a/libs/Tree/Directory.php b/libs/Tree/Directory.php index 1ad0f1d..4935da5 100644 --- a/libs/Tree/Directory.php +++ b/libs/Tree/Directory.php @@ -9,6 +9,9 @@ class Directory extends Entry uasort($this->children, array($this, 'compareEntries')); } + /** + * @return Entry[] + */ public function getEntries() { return $this->children; From a13469047abcc322b8e38025b7e09826f6c8b85a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 23:13:02 +0200 Subject: [PATCH 050/127] Move getIndexPage and getFirstPage to Directory --- daux.phar | Bin 712625 -> 712843 bytes libs/Daux.php | 6 +-- libs/DauxHelper.php | 4 +- libs/Tree/Builder.php | 44 ++++++++++------------ libs/Tree/Directory.php | 79 ++++++++++++++++++++++++++++++++++++++++ libs/Tree/Entry.php | 70 ----------------------------------- libs/Tree/Root.php | 25 ++++++++++++- 7 files changed, 128 insertions(+), 100 deletions(-) mode change 100755 => 100644 daux.phar diff --git a/daux.phar b/daux.phar old mode 100755 new mode 100644 index 9f24c514ae2c6bfc009c2b339920884a05af4b49..28ceb5727293d8eee9d498b999ea57fbf744d850 GIT binary patch delta 4757 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 delta 4649 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 = new Root($this->docs_path); - Builder::build($this->tree, $this->options['ignore'], $this->getParams()); + $this->tree = new Root($this->getParams(), $this->docs_path); + Builder::build($this->tree, $this->options['ignore']); if (!empty($this->options['languages'])) { foreach ($this->options['languages'] as $key => $node) { @@ -176,7 +176,7 @@ class Daux if ($this->tree) { $this->options['tree'] = $this->tree; - $this->options['index'] = ($index = $this->tree->getIndexPage()) ? $index : $this->tree->getFirstPage(); + $this->options['index'] = $this->tree->getIndexPage() ?: $this->tree->getFirstPage(); if ($this->options['multilanguage']) { foreach ($this->options['languages'] as $key => $name) { $this->options['entry_page'][$key] = $this->tree->getEntries()[$key]->getFirstPage(); diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index d8bc911..53aa390 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -133,8 +133,8 @@ class DauxHelper return $tree; } - if ($tree->getIndexPage()) { - return $tree->getIndexPage(); + if ($index = $tree->getIndexPage()) { + return $index; } return false; diff --git a/libs/Tree/Builder.php b/libs/Tree/Builder.php index e4f0225..0df78f5 100644 --- a/libs/Tree/Builder.php +++ b/libs/Tree/Builder.php @@ -11,9 +11,8 @@ class Builder * * @param Directory $node * @param array $ignore - * @param Config $params */ - public static function build($node, $ignore, Config $params) + public static function build($node, $ignore) { if (!$dh = opendir($node->getPath())) { return; @@ -42,45 +41,44 @@ class Builder $new = new Directory($node, static::getUriFromFilename(static::getFilename($path)), $path); $new->setName(DauxHelper::pathinfo($path)['filename']); $new->setTitle(static::getTitleFromFilename($new->getName())); - static::build($new, $ignore, $params); + static::build($new, $ignore); } else { - static::createContent($node, $path, $params); + static::createContent($node, $path); } } $node->sort(); - if (isset($node->getEntries()[$params['index_key']])) { - $node->getEntries()[$params['index_key']]->setFirstPage($node->getFirstPage()); - $node->setIndexPage($node->getEntries()[$params['index_key']]); - } else { - $node->setIndexPage(false); - } } /** * @param Directory $parent * @param string $path - * @param Config $params * @return Content|Raw */ - public static function createContent(Directory $parent, $path, Config $params) + public static function createContent(Directory $parent, $path) { $name = DauxHelper::pathinfo($path)['filename']; - if (in_array(pathinfo($path, PATHINFO_EXTENSION), Daux::$VALID_MARKDOWN_EXTENSIONS)) { - $uri = static::getUriFromFilename($name); - if ($params['mode'] === Daux::STATIC_MODE) { - $uri .= '.html'; - } - - $entry = new Content($parent, $uri, $path, filemtime($path)); - } else { + if (!in_array(pathinfo($path, PATHINFO_EXTENSION), Daux::$VALID_MARKDOWN_EXTENSIONS)) { $entry = new Raw($parent, static::getUriFromFilename(static::getFilename($path)), $path, filemtime($path)); + $entry->setTitle(static::getTitleFromFilename($name)); + $entry->setName($name); + + return $entry; } - if ($entry->getUri() == $params['index_key']) { + $config = $parent->getConfig(); + + $uri = static::getUriFromFilename($name); + if ($config['mode'] === Daux::STATIC_MODE) { + $uri .= '.html'; + } + + $entry = new Content($parent, $uri, $path, filemtime($path)); + + if ($entry->getUri() == $config['index_key']) { if ($parent instanceof Root) { - $entry->setTitle($params['title']); + $entry->setTitle($config['title']); } else { $entry->setTitle($parent->getTitle()); } @@ -88,7 +86,6 @@ class Builder $entry->setTitle(static::getTitleFromFilename($name)); } - $entry->setIndexPage(false); $entry->setName($name); return $entry; @@ -181,7 +178,6 @@ class Builder if ($title == 'index') { $page->setName('_index'); $page->setTitle($parent->getTitle()); - $parent->setIndexPage($page); } else { $page->setName($slug); $page->setTitle($title); diff --git a/libs/Tree/Directory.php b/libs/Tree/Directory.php index 4935da5..b6461da 100644 --- a/libs/Tree/Directory.php +++ b/libs/Tree/Directory.php @@ -2,8 +2,12 @@ class Directory extends Entry { + /** @var Entry[] */ protected $children = []; + /** @var Content */ + protected $first_page; + public function sort() { uasort($this->children, array($this, 'compareEntries')); @@ -27,6 +31,78 @@ class Directory extends Entry unset($this->children[$entry->getUri()]); } + /** + * @return \Todaymade\Daux\Config + */ + public function getConfig() + { + if (!$this->parent) { + throw new \RuntimeException("Could not retrieve configuration. Are you sure that your tree has a Root ?"); + } + + return $this->parent->getConfig(); + } + + /** + * @return Content|null + */ + public function getIndexPage() + { + $index_key = $this->getConfig()['index_key']; + + if (isset($this->children[$index_key])) { + return $this->children[$index_key]; + } + + return null; + } + + /** + * @return Content|false + */ + public function getFirstPage() + { + if ($this->first_page) { + return $this->first_page; + } + + if (!$this instanceof Directory) { + return false; + } + + // First we try to find a real page + foreach ($this->getEntries() as $node) { + if ($node instanceof Content) { + // TODO :: this condition looks weird ... + if (!$node->getParent() && $node->getTitle() == 'index') { + //the homepage should not count as first page + continue; + } + + $this->setFirstPage($node); + return $node; + } + } + + // If we can't find one we check in the sub-directories + foreach ($this->getEntries() as $node) { + if ($node instanceof Directory && $page = $node->getFirstPage()) { + $this->setFirstPage($page); + return $page; + } + } + + return false; + } + + /** + * @param Content $first_page + */ + public function setFirstPage($first_page) + { + $this->first_page = $first_page; + } + private function compareEntries($a, $b) { $name_a = explode('_', $a->name); @@ -76,6 +152,9 @@ class Directory extends Entry { $dump = parent::dump(); + $dump['index'] = $this->getIndexPage() ? $this->getIndexPage()->getUrl() : ''; + $dump['first'] = $this->getFirstPage() ? $this->getFirstPage()->getUrl() : ''; + foreach ($this->getEntries() as $entry) { $dump['children'][] = $entry->dump(); } diff --git a/libs/Tree/Entry.php b/libs/Tree/Entry.php index 5c23919..2d989e3 100644 --- a/libs/Tree/Entry.php +++ b/libs/Tree/Entry.php @@ -8,12 +8,6 @@ abstract class Entry /** @var string */ protected $name; - /** @var Content */ - protected $index_page; - - /** @var Content */ - protected $first_page; - /** @var string */ protected $uri; @@ -86,68 +80,6 @@ abstract class Entry } } - /** - * @return Content - */ - public function getIndexPage() - { - return $this->index_page; - } - - /** - * @param Content $index_page - */ - public function setIndexPage($index_page) - { - $this->index_page = $index_page; - } - - /** - * @return Content|false - */ - public function getFirstPage() - { - if ($this->first_page) { - return $this->first_page; - } - - if (!$this instanceof Directory) { - return false; - } - - // First we try to find a real page - foreach ($this->getEntries() as $node) { - if ($node instanceof Content) { - // TODO :: this condition looks weird ... - if (!$node->getParent() && $node->getTitle() == 'index') { - //the homepage should not count as first page - continue; - } - - $this->setFirstPage($node); - return $node; - } - } - - // If we can't find one we check in the sub-directories - foreach ($this->getEntries() as $node) { - if ($node instanceof Directory && $page = $node->getFirstPage()) { - $this->setFirstPage($page); - return $page; - } - } - - return false; - } - - /** - * @param Content $first_page - */ - public function setFirstPage($first_page) - { - $this->first_page = $first_page; - } - /** * @return string */ @@ -232,8 +164,6 @@ abstract class Entry 'name' => $this->getName(), 'uri' => $this->getUri(), 'url' => $this->getUrl(), - 'index' => $this->getIndexPage() ? $this->getIndexPage()->getUrl() : '', - 'first' => $this->getFirstPage() ? $this->getFirstPage()->getUrl() : '', 'path' => $this->path ]; } diff --git a/libs/Tree/Root.php b/libs/Tree/Root.php index 92eec5c..3e4d49b 100644 --- a/libs/Tree/Root.php +++ b/libs/Tree/Root.php @@ -1,15 +1,38 @@ setConfig($config); + $this->setUri($uri); $this->path = $uri; } + + /** + * @return Config + */ + public function getConfig() + { + return $this->config; + } + + /** + * @param Config $config + */ + public function setConfig($config) + { + $this->config = $config; + } } From e70461b641ed4b4f0b4c559eba615851dcb22308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 23:50:47 +0200 Subject: [PATCH 051/127] Fix and simplify homepage detection in HTML generator --- libs/Format/HTML/MarkdownPage.php | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/libs/Format/HTML/MarkdownPage.php b/libs/Format/HTML/MarkdownPage.php index fa0faef..ba2c0bd 100644 --- a/libs/Format/HTML/MarkdownPage.php +++ b/libs/Format/HTML/MarkdownPage.php @@ -1,5 +1,8 @@ homepage = false; - if ($this->title === 'index') { - $minimum_parent_dir_size = ($this->params['multilanguage']) ? 2 : 1; - if (count($this->file->getParents()) >= $minimum_parent_dir_size) { - $this->title = $this->file->getParent()->getTitle(); - } else { - $this->homepage = ($this->file->getName() === '_index'); - $this->title = $this->params['title']; + if ($this->file->getParent()->getIndexPage() == $this->file) { + if ($this->params['multilanguage']) { + if ($this->file->getParent()->getParent() instanceof Root) { + $this->homepage = true; + } + } elseif ($this->file->getParent() instanceof Root) { + $this->homepage = true; } } @@ -50,7 +53,7 @@ class MarkdownPage extends \Todaymade\Daux\Format\Base\MarkdownPage $params = $this->params; $entry_page = []; - if ($params['request'] === $params['index_key']) { + if ($this->homepage) { if ($params['multilanguage']) { foreach ($params['languages'] as $key => $name) { $entry_page[$name] = $params['base_page'] . $params['entry_page'][$key]->getUrl(); @@ -58,8 +61,6 @@ class MarkdownPage extends \Todaymade\Daux\Format\Base\MarkdownPage } else { $entry_page['View Documentation'] = $params['base_page'] . $params['entry_page']->getUrl(); } - } elseif ($params['file_uri'] === 'index') { - $entry_page[$params['entry_page']->getTitle()] = $params['base_page'] . $params['entry_page']->getUrl(); } $page = [ From bb3a3408fdda3cc39fe6229c0ff29b0187f51abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sat, 18 Jul 2015 23:51:23 +0200 Subject: [PATCH 052/127] Bugfix in the path rebase from the HTML Generator --- daux.phar | Bin 712843 -> 712921 bytes libs/Format/HTML/Generator.php | 24 +++++++++++++++++++----- libs/Tree/Builder.php | 1 - 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/daux.phar b/daux.phar index 28ceb5727293d8eee9d498b999ea57fbf744d850..d798523996d2d9bfe1c2b92c90653cf7c5835f0c 100644 GIT binary patch delta 4230 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 r&vjy@{37|Zb_xt@)0t5&kU{!Q&nNHQM^~J6I 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, $destination, $params, $output, $width); } + private function rebaseConfig(Config $config, $base_url) + { + // Avoid changing the url if it is already correct + if ($config['base_url'] == $base_url && !empty($config['theme']) && !is_string($config['theme'])) { + return; + } + + // Change base url for all links on the pages + $config['base_url'] = $config['base_page'] = $base_url; + $config['theme'] = DauxHelper::getTheme($config, $base_url); + $config['image'] = str_replace('', $base_url, $config['image']); + } + /** * Recursively generate the documentation * @@ -45,20 +59,20 @@ class Generator */ private function generateRecursive(Directory $tree, $output_dir, $params, $output, $width, $base_url = '') { - $params['base_url'] = $params['base_page'] = $base_url; + $this->rebaseConfig($params, $base_url); - // Rebase Theme - $params['theme'] = DauxHelper::getTheme($params, $base_url); - - $params['image'] = str_replace('', $base_url, $params['image']); if ($base_url !== '' && empty($params['entry_page'])) { $params['entry_page'] = $tree->getFirstPage(); } + foreach ($tree->getEntries() as $key => $node) { if ($node instanceof Directory) { $new_output_dir = $output_dir . DS . $key; mkdir($new_output_dir); $this->generateRecursive($node, $new_output_dir, $params, $output, $width, '../' . $base_url); + + // Rebase configuration again as $params is a shared object + $this->rebaseConfig($params, $base_url); } elseif ($node instanceof Content) { $this->runAction( "- " . $node->getUrl(), diff --git a/libs/Tree/Builder.php b/libs/Tree/Builder.php index 0df78f5..e45252a 100644 --- a/libs/Tree/Builder.php +++ b/libs/Tree/Builder.php @@ -1,6 +1,5 @@ Date: Sun, 19 Jul 2015 00:55:57 +0200 Subject: [PATCH 053/127] Improve processors Now you can add generators and extend the markdown parser --- libs/Daux.php | 17 +++++++ .../Base/CommonMark/CommonMarkConverter.php | 5 +- libs/Format/Base/Generator.php | 10 ++++ libs/Format/Confluence/Generator.php | 5 +- libs/Format/HTML/Generator.php | 7 ++- libs/Generator/Command.php | 50 ++++++++++++++----- libs/Processor.php | 14 ++++++ 7 files changed, 89 insertions(+), 19 deletions(-) create mode 100644 libs/Format/Base/Generator.php diff --git a/libs/Daux.php b/libs/Daux.php index cf7ef3a..f113b9a 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -210,5 +210,22 @@ class Daux public function setProcessor(Processor $processor) { $this->processor = $processor; + + // This is not the cleanest but it's + // the best i've found to use the + // processor in very remote places + $this->options['processor_instance'] = $processor; + } + + public function getGenerators() + { + $default = [ + 'confluence' => '\Todaymade\Daux\Format\Confluence\Generator', + 'html' => '\Todaymade\Daux\Format\HTML\Generator', + ]; + + $extended = $this->getProcessor()->addGenerators(); + + return array_replace($default, $extended); } } diff --git a/libs/Format/Base/CommonMark/CommonMarkConverter.php b/libs/Format/Base/CommonMark/CommonMarkConverter.php index b918c4c..afc61bc 100644 --- a/libs/Format/Base/CommonMark/CommonMarkConverter.php +++ b/libs/Format/Base/CommonMark/CommonMarkConverter.php @@ -18,8 +18,9 @@ class CommonMarkConverter extends \League\CommonMark\CommonMarkConverter $this->extendEnvironment($environment); - //TODO :: finish - //$daux->getProcessor()->extendCommonMarkEnvironment($environment); + if (array_key_exists('processor_instance', $config['daux'])) { + $config['daux']['processor_instance']->extendCommonMarkEnvironment($environment); + } $this->docParser = new DocParser($environment); $this->htmlRenderer = new HtmlRenderer($environment); diff --git a/libs/Format/Base/Generator.php b/libs/Format/Base/Generator.php new file mode 100644 index 0000000..01b4bb3 --- /dev/null +++ b/libs/Format/Base/Generator.php @@ -0,0 +1,10 @@ +getParams()['confluence']; diff --git a/libs/Format/HTML/Generator.php b/libs/Format/HTML/Generator.php index dc4370a..7bac65d 100644 --- a/libs/Format/HTML/Generator.php +++ b/libs/Format/HTML/Generator.php @@ -1,5 +1,6 @@ getOption('destination'); + $params = $daux->getParams(); if (is_null($destination)) { $destination = $daux->local_base . DS . 'static'; diff --git a/libs/Generator/Command.php b/libs/Generator/Command.php index a18636e..18d3e5c 100644 --- a/libs/Generator/Command.php +++ b/libs/Generator/Command.php @@ -32,24 +32,48 @@ class Command extends SymfonyCommand $processor = $input->getOption('processor'); if (!empty($processor) && $processor != 'none') { - $class = "\\Todaymade\\Daux\\Extension\\" . $processor; - if (class_exists($class)) { - $daux->setProcessor(new $class($daux, $output, $width)); - } elseif (file_exists($processor)) { - include $processor; - } + $this->prepareProcessor($processor, $daux, $output, $width); } // Improve the tree with a processor $daux->getProcessor()->manipulateTree($daux->tree); - switch (strtolower($input->getOption('format'))) { - case 'confluence': - (new ConfluenceGenerator())->generate($daux, $output, $width); - break; - case 'html': - default: - (new HTMLGenerator())->generate($daux, $input->getOption('destination'), $output, $width); + $this->launchGeneration($daux, $input, $output, $width); + } + + protected function prepareProcessor($processor, Daux $daux, OutputInterface $output, $width) + { + $class = "\\Todaymade\\Daux\\Extension\\" . $processor; + if (class_exists($class)) { + $daux->setProcessor(new $class($daux, $output, $width)); + } elseif (file_exists($processor)) { + include $processor; } } + + protected function launchGeneration(Daux $daux, InputInterface $input, OutputInterface $output, $width) + { + $generators = $daux->getGenerators(); + + $format = strtolower($input->getOption('format')); + if (empty($format)) { + $format = 'html'; + } + + if (!array_key_exists($format, $generators)) { + throw new \RuntimeException("The format '$format' doesn't exist, did you forget to set your processor ?"); + } + + $class = $generators[$format]; + if (!class_exists($class)) { + throw new \RuntimeException("Class '$class' not found. We cannot use it as a Generator"); + } + + $interface = 'Todaymade\Daux\Format\Base\Generator'; + if (!in_array('Todaymade\Daux\Format\Base\Generator', class_implements($class))) { + throw new \RuntimeException("the class '$class' does not implement the '$interface' interface"); + } + + (new $class())->generate($daux, $input, $output, $width); + } } diff --git a/libs/Processor.php b/libs/Processor.php index b5cd2b0..f94ca65 100644 --- a/libs/Processor.php +++ b/libs/Processor.php @@ -54,4 +54,18 @@ class Processor public function extendCommonMarkEnvironment(Environment $environment) { } + + /** + * Provide new generators with this extension point. You + * can simply return an array, the key is the format's + * name, the value is a class name implementing the + * `Todaymade\Daux\Format\Base\Generator` contract. + * You can also replace base generators. + * + * @return array + */ + public function addGenerators() + { + return []; + } } From 87fbb6f15d7e05f076c9315fc683879daa82503d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sun, 19 Jul 2015 01:05:43 +0200 Subject: [PATCH 054/127] Initialize the markdown parser only once. --- libs/Format/Base/MarkdownPage.php | 12 +++++++++--- libs/Format/Confluence/Generator.php | 13 ++++++++++--- libs/Format/Confluence/MarkdownPage.php | 6 ------ libs/Format/HTML/Generator.php | 10 +++++++++- libs/Format/HTML/MarkdownPage.php | 1 - libs/Server/Server.php | 3 ++- 6 files changed, 30 insertions(+), 15 deletions(-) diff --git a/libs/Format/Base/MarkdownPage.php b/libs/Format/Base/MarkdownPage.php index cc8659b..2111c28 100644 --- a/libs/Format/Base/MarkdownPage.php +++ b/libs/Format/Base/MarkdownPage.php @@ -1,7 +1,7 @@ initializePage($title, $content); @@ -38,7 +43,7 @@ abstract class MarkdownPage extends SimplePage protected function getMarkdownConverter() { - return new CommonMarkConverter(['daux' => $this->params]); + return $this->converter; } protected function convertPage($content) @@ -51,11 +56,12 @@ abstract class MarkdownPage extends SimplePage return $this->convertPage($this->content); } - public static function fromFile(Content $file, $params) + public static function fromFile(Content $file, $params, CommonMarkConverter $converter) { $page = new static($file->getTitle(), $file->getContent()); $page->setFile($file); $page->setParams($params); + $page->converter = $converter; return $page; } diff --git a/libs/Format/Confluence/Generator.php b/libs/Format/Confluence/Generator.php index 5c64e0b..8a1e6c0 100644 --- a/libs/Format/Confluence/Generator.php +++ b/libs/Format/Confluence/Generator.php @@ -4,6 +4,7 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Todaymade\Daux\Config; use Todaymade\Daux\Daux; +use Todaymade\Daux\Format\Confluence\CommonMark\CommonMarkConverter; use Todaymade\Daux\Format\Base\RunAction; use Todaymade\Daux\Tree\Content; use Todaymade\Daux\Tree\Directory; @@ -17,13 +18,19 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator */ protected $prefix; + /** + * @var CommonMarkConverter + */ + protected $converter; + public function generate(Daux $daux, InputInterface $input, OutputInterface $output, $width) { - $confluence = $daux->getParams()['confluence']; + $params = $daux->getParams(); + $confluence = $params['confluence']; $this->prefix = trim($confluence['prefix']) . " "; - $params = $daux->getParams(); + $this->converter = new CommonMarkConverter(['daux' => $params]); $tree = $this->runAction( "Generating Tree ...", @@ -68,7 +75,7 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator $data = [ 'title' => $this->prefix . $node->getTitle(), 'file' => $node, - 'page' => MarkdownPage::fromFile($node, $params), + 'page' => MarkdownPage::fromFile($node, $params, $this->converter), ]; // As the page is lazily generated diff --git a/libs/Format/Confluence/MarkdownPage.php b/libs/Format/Confluence/MarkdownPage.php index e8b1d5f..cd8018a 100644 --- a/libs/Format/Confluence/MarkdownPage.php +++ b/libs/Format/Confluence/MarkdownPage.php @@ -2,17 +2,11 @@ use DOMDocument; use Todaymade\Daux\DauxHelper; -use Todaymade\Daux\Format\Confluence\CommonMark\CommonMarkConverter; class MarkdownPage extends \Todaymade\Daux\Format\Base\MarkdownPage { public $attachments = []; - protected function getMarkdownConverter() - { - return new CommonMarkConverter(['daux' => $this->params]); - } - protected function generatePage() { $page = parent::generatePage(); diff --git a/libs/Format/HTML/Generator.php b/libs/Format/HTML/Generator.php index 7bac65d..4bf3610 100644 --- a/libs/Format/HTML/Generator.php +++ b/libs/Format/HTML/Generator.php @@ -5,6 +5,7 @@ use Symfony\Component\Console\Output\OutputInterface; use Todaymade\Daux\Config; use Todaymade\Daux\Daux; use Todaymade\Daux\DauxHelper; +use Todaymade\Daux\Format\Base\CommonMark\CommonMarkConverter; use Todaymade\Daux\Format\Base\RunAction; use Todaymade\Daux\Generator\Helper; use Todaymade\Daux\Tree\Directory; @@ -14,6 +15,11 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator { use RunAction; + /** + * @var CommonMarkConverter + */ + protected $converter; + public function generate(Daux $daux, InputInterface $input, OutputInterface $output, $width) { $destination = $input->getOption('destination'); @@ -23,6 +29,8 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator $destination = $daux->local_base . DS . 'static'; } + $this->converter = new CommonMarkConverter(['daux' => $params]); + $this->runAction( "Copying Static assets ...", $output, @@ -85,7 +93,7 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator $params['request'] = $node->getUrl(); $params['file_uri'] = $node->getName(); - $page = MarkdownPage::fromFile($node, $params); + $page = MarkdownPage::fromFile($node, $params, $this->converter); file_put_contents($output_dir . DS . $key, $page->getContent()); } ); diff --git a/libs/Format/HTML/MarkdownPage.php b/libs/Format/HTML/MarkdownPage.php index ba2c0bd..6717ee7 100644 --- a/libs/Format/HTML/MarkdownPage.php +++ b/libs/Format/HTML/MarkdownPage.php @@ -1,6 +1,5 @@ getFirstPage(); } - return MarkdownPage::fromFile($file, $params); + return MarkdownPage::fromFile($file, $params, new CommonMarkConverter(['daux' => $params])); } public function getRequest() From d531de86cf1fb9e1fb09c55959822c60c5bad993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sun, 19 Jul 2015 01:16:04 +0200 Subject: [PATCH 055/127] Cleaned getFirstPage a bit --- libs/Tree/Directory.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/libs/Tree/Directory.php b/libs/Tree/Directory.php index b6461da..1e1851c 100644 --- a/libs/Tree/Directory.php +++ b/libs/Tree/Directory.php @@ -66,16 +66,11 @@ class Directory extends Entry return $this->first_page; } - if (!$this instanceof Directory) { - return false; - } - // First we try to find a real page foreach ($this->getEntries() as $node) { if ($node instanceof Content) { - // TODO :: this condition looks weird ... - if (!$node->getParent() && $node->getTitle() == 'index') { - //the homepage should not count as first page + if ($this instanceof Root && $this->getIndexPage() == $node) { + // The homepage should not count as first page continue; } From 932fab5a844b0c60200057c42dcc53cf69a3748b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sun, 19 Jul 2015 12:21:09 +0200 Subject: [PATCH 056/127] Transform the server to be able to use the Generator --- libs/Format/Base/Generator.php | 13 +++++- libs/Format/Confluence/Generator.php | 33 ++++++++------ libs/Format/HTML/Generator.php | 67 +++++++++++++++++----------- libs/Generator/Command.php | 2 +- libs/Server/Server.php | 19 ++------ 5 files changed, 76 insertions(+), 58 deletions(-) diff --git a/libs/Format/Base/Generator.php b/libs/Format/Base/Generator.php index 01b4bb3..a7602df 100644 --- a/libs/Format/Base/Generator.php +++ b/libs/Format/Base/Generator.php @@ -6,5 +6,16 @@ use Todaymade\Daux\Daux; interface Generator { - public function generate(Daux $daux, InputInterface $input, OutputInterface $output, $width); + /** + * @param Daux $daux + */ + public function __construct(Daux $daux); + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @param integer $width + * @return mixed + */ + public function generateAll(InputInterface $input, OutputInterface $output, $width); } diff --git a/libs/Format/Confluence/Generator.php b/libs/Format/Confluence/Generator.php index 8a1e6c0..d159e10 100644 --- a/libs/Format/Confluence/Generator.php +++ b/libs/Format/Confluence/Generator.php @@ -13,32 +13,38 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator { use RunAction; - /** - * @var string - */ + /** @var string */ protected $prefix; - /** - * @var CommonMarkConverter - */ + /** @var CommonMarkConverter */ protected $converter; - public function generate(Daux $daux, InputInterface $input, OutputInterface $output, $width) + /** @var Daux */ + protected $daux; + + /** + * @param Daux $daux + */ + public function __construct(Daux $daux) { - $params = $daux->getParams(); + $this->daux = $daux; + $this->converter = new CommonMarkConverter(['daux' => $this->daux->getParams()]); + } + + public function generateAll(InputInterface $input, OutputInterface $output, $width) + { + $params = $this->daux->getParams(); $confluence = $params['confluence']; $this->prefix = trim($confluence['prefix']) . " "; - $this->converter = new CommonMarkConverter(['daux' => $params]); - $tree = $this->runAction( "Generating Tree ...", $output, $width, - function() use ($daux, $params) { - $tree = $this->generateRecursive($daux->tree, $params); - $tree['title'] = $this->prefix . $daux->getParams()['title']; + function() use ($params) { + $tree = $this->generateRecursive($this->daux->tree, $params); + $tree['title'] = $this->prefix . $params['title']; return $tree; } @@ -70,7 +76,6 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator ); } elseif ($node instanceof Content) { $params['request'] = $node->getUrl(); - $params['file_uri'] = $node->getName(); $data = [ 'title' => $this->prefix . $node->getTitle(), diff --git a/libs/Format/HTML/Generator.php b/libs/Format/HTML/Generator.php index 4bf3610..6b237b0 100644 --- a/libs/Format/HTML/Generator.php +++ b/libs/Format/HTML/Generator.php @@ -8,40 +8,50 @@ use Todaymade\Daux\DauxHelper; use Todaymade\Daux\Format\Base\CommonMark\CommonMarkConverter; use Todaymade\Daux\Format\Base\RunAction; use Todaymade\Daux\Generator\Helper; -use Todaymade\Daux\Tree\Directory; use Todaymade\Daux\Tree\Content; +use Todaymade\Daux\Tree\Directory; +use Todaymade\Daux\Tree\Entry; +use Todaymade\Daux\Tree\Raw; class Generator implements \Todaymade\Daux\Format\Base\Generator { use RunAction; - /** - * @var CommonMarkConverter - */ + /** @var CommonMarkConverter */ protected $converter; - public function generate(Daux $daux, InputInterface $input, OutputInterface $output, $width) + /** @var Daux */ + protected $daux; + + /** + * @param Daux $daux + */ + public function __construct(Daux $daux) + { + $this->daux = $daux; + $this->converter = new CommonMarkConverter(['daux' => $this->daux->getParams()]); + } + + public function generateAll(InputInterface $input, OutputInterface $output, $width) { $destination = $input->getOption('destination'); - $params = $daux->getParams(); + $params = $this->daux->getParams(); if (is_null($destination)) { - $destination = $daux->local_base . DS . 'static'; + $destination = $this->daux->local_base . DS . 'static'; } - $this->converter = new CommonMarkConverter(['daux' => $params]); - $this->runAction( "Copying Static assets ...", $output, $width, - function() use ($destination, $daux) { - Helper::copyAssets($destination, $daux->local_base); + function () use ($destination) { + Helper::copyAssets($destination, $this->daux->local_base); } ); $output->writeLn("Generating ..."); - $this->generateRecursive($daux->tree, $destination, $params, $output, $width); + $this->generateRecursive($this->daux->tree, $destination, $params, $output, $width); } private function rebaseConfig(Config $config, $base_url) @@ -84,29 +94,32 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator // Rebase configuration again as $params is a shared object $this->rebaseConfig($params, $base_url); - } elseif ($node instanceof Content) { - $this->runAction( - "- " . $node->getUrl(), - $output, - $width, - function() use ($node, $output_dir, $key, $params) { - $params['request'] = $node->getUrl(); - $params['file_uri'] = $node->getName(); - - $page = MarkdownPage::fromFile($node, $params, $this->converter); - file_put_contents($output_dir . DS . $key, $page->getContent()); - } - ); } else { $this->runAction( "- " . $node->getUrl(), $output, $width, - function() use ($node, $output_dir, $key) { - copy($node->getPath(), $output_dir . DS . $key); + function () use ($node, $output_dir, $key, $params) { + if (!$node instanceof Content) { + copy($node->getPath(), $output_dir . DS . $key); + return; + } + + $generated = $this->generateOne($node, $params); + file_put_contents($output_dir . DS . $key, $generated->getContent()); } ); } } } + + public function generateOne(Entry $node, $params) + { + if ($node instanceof Raw) { + return new RawPage($node->getPath()); + } + + $params['request'] = $node->getUrl(); + return MarkdownPage::fromFile($node, $params, $this->converter); + } } diff --git a/libs/Generator/Command.php b/libs/Generator/Command.php index 18d3e5c..ff22c15 100644 --- a/libs/Generator/Command.php +++ b/libs/Generator/Command.php @@ -74,6 +74,6 @@ class Command extends SymfonyCommand throw new \RuntimeException("the class '$class' does not implement the '$interface' interface"); } - (new $class())->generate($daux, $input, $output, $width); + (new $class($daux))->generateAll($input, $output, $width); } } diff --git a/libs/Server/Server.php b/libs/Server/Server.php index 13be5db..9902cc0 100644 --- a/libs/Server/Server.php +++ b/libs/Server/Server.php @@ -3,10 +3,8 @@ use Todaymade\Daux\Daux; use Todaymade\Daux\DauxHelper; use Todaymade\Daux\Exception; -use Todaymade\Daux\Format\Base\CommonMark\CommonMarkConverter; -use Todaymade\Daux\Format\HTML\MarkdownPage; +use Todaymade\Daux\Format\HTML\Generator; use Todaymade\Daux\Format\HTML\RawPage; -use Todaymade\Daux\Tree\Raw; class Server { @@ -123,18 +121,9 @@ class Server throw new NotFoundException('The Page you requested is yet to be made. Try again later.'); } - if ($file instanceof Raw) { - return new RawPage($file->getPath()); - } - - $params = $this->params; - - $params['request'] = $request; - $params['file_uri'] = $file->getUri(); - if ($request !== 'index') { - $params['entry_page'] = $file->getFirstPage(); - } - return MarkdownPage::fromFile($file, $params, new CommonMarkConverter(['daux' => $params])); + // TODO :: make it possible to replace the generator in live code + $generator = new Generator($this->daux); + return $generator->generateOne($file, $this->params); } public function getRequest() From a7962839d0ff1a60cfd2adc13bd1c401227d7a10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sun, 19 Jul 2015 12:40:49 +0200 Subject: [PATCH 057/127] Be able to serve the website simply with the phar archive --- daux.phar | Bin 712921 -> 715082 bytes index.php | 9 ++++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/daux.phar b/daux.phar index d798523996d2d9bfe1c2b92c90653cf7c5835f0c..3621bae04c8e581fcbca7b8a0d5ac3c1962d0bf3 100644 GIT binary patch delta 6982 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 Date: Sun, 19 Jul 2015 12:41:04 +0200 Subject: [PATCH 058/127] Update htaccess --- .htaccess | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.htaccess b/.htaccess index 8332740..b85a566 100644 --- a/.htaccess +++ b/.htaccess @@ -3,4 +3,4 @@ RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d -RewriteRule !\.(gif|jpg|png|css|js|html|ico|zip|rar|pdf|xml|mp4|mpg|flv|swf|mkv|ogg|avi|woff|svg|eot|ttf|jar)$ index.php [L,QSA] \ No newline at end of file +RewriteRule . index.php [L,QSA] From 1f167db1f6aa33ef25fdc86ee6449d795186bfb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sun, 19 Jul 2015 14:04:29 +0200 Subject: [PATCH 059/127] Fixed error page --- libs/Server/ErrorPage.php | 1 + templates/layout/05_page.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/Server/ErrorPage.php b/libs/Server/ErrorPage.php index 74439a9..5311e64 100644 --- a/libs/Server/ErrorPage.php +++ b/libs/Server/ErrorPage.php @@ -34,6 +34,7 @@ class ErrorPage extends SimplePage $page = [ 'title' => $this->title, 'content' => $this->content, + 'language' => '', ]; $template = new Template($params['templates'], $params['theme']['templates']); diff --git a/templates/layout/05_page.php b/templates/layout/05_page.php index 9703764..44b5346 100644 --- a/templates/layout/05_page.php +++ b/templates/layout/05_page.php @@ -22,8 +22,8 @@ - - Fork me on GitHub + + Fork me on GitHub
    @@ -28,7 +28,7 @@
    View On GitHub'; + if ($params['html']['repo']) echo 'View On GitHub'; foreach ($page['entry_page'] as $key => $node) echo '' . $key . ''; ?>
    @@ -50,17 +50,17 @@
    - +