From 8754af58cb72bba0a323af0b8ceab34b94888d2a Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 12 Mar 2020 20:45:51 +0000 Subject: [PATCH 001/691] fix undefined variables (psalm) --- common.php | 2 ++ public/edit.php | 2 +- public/list-virtual.php | 2 ++ public/vacation.php | 5 +++++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/common.php b/common.php index 7e13da7a..daea0bad 100644 --- a/common.php +++ b/common.php @@ -53,6 +53,7 @@ if (!is_file("$incpath/config.inc.php")) { global $CONF; + require_once("$incpath/config.inc.php"); @@ -64,6 +65,7 @@ if (isset($CONF['configured']) && !defined('PHPUNIT_TEST')) { Config::write($CONF); +$PALANG = []; require_once("$incpath/languages/language.php"); require_once("$incpath/functions.inc.php"); if (extension_loaded('Phar') && ( version_compare(PHP_VERSION, '7.0.0') < 0)) { diff --git a/public/edit.php b/public/edit.php index dae86643..2ffea21d 100644 --- a/public/edit.php +++ b/public/edit.php @@ -37,7 +37,7 @@ if (!preg_match('/^[a-z]+$/', $table) || !file_exists(dirname(__FILE__) . "/../m } $error = 0; - +$values = []; $edit = safepost('edit', safeget('edit')); $new = 0; if ($edit == "") { diff --git a/public/list-virtual.php b/public/list-virtual.php index d3347cbf..2d66fad0 100644 --- a/public/list-virtual.php +++ b/public/list-virtual.php @@ -86,6 +86,8 @@ $_SESSION['prefill:aliasdomain:target_domain'] = $fDomain; $_SESSION['list-virtual:limit'] = $fDisplay; +$tAliasDomains = []; +$aliasdomain_data = []; # # alias domain diff --git a/public/vacation.php b/public/vacation.php index 0986e428..36661734 100644 --- a/public/vacation.php +++ b/public/vacation.php @@ -75,6 +75,11 @@ foreach (array_keys($choice_of_reply) as $key) { $choice_of_reply[$key] = Config::Lang($choice_of_reply[$key]); } +$tUseremail = null; +$tInterval_Time = null; +$tBody = null; +$tSubject = null; + if ($_SERVER['REQUEST_METHOD'] == "GET") { $tSubject = ''; $tBody = ''; From d2b8f7ac15016a931ff0707e1ab4e89fa1f853a8 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Fri, 13 Mar 2020 22:03:40 +0000 Subject: [PATCH 002/691] might fix: https://github.com/postfixadmin/postfixadmin/issues/306 --- model/FetchmailHandler.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/model/FetchmailHandler.php b/model/FetchmailHandler.php index e117d44e..de584dd0 100644 --- a/model/FetchmailHandler.php +++ b/model/FetchmailHandler.php @@ -173,6 +173,10 @@ class FetchmailHandler extends PFAHandler { } return true; } + + public function domain_from_id() { + return ''; + } } /* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */ From fefe3f7df5f8c6a3f57eb81c2790f4ab63f0894a Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 14 Mar 2020 21:08:50 +0000 Subject: [PATCH 003/691] default domain_quota_default to -1 if not specified - see https://github.com/postfixadmin/postfixadmin/issues/299 --- model/DomainHandler.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/model/DomainHandler.php b/model/DomainHandler.php index a05f8167..40b0bb7e 100644 --- a/model/DomainHandler.php +++ b/model/DomainHandler.php @@ -43,6 +43,13 @@ class DomainHandler extends PFAHandler { # NOTE: There are dependencies between alias_count, mailbox_count and total_quota. # NOTE: If you disable "display in list" for one of them, the SQL query for the others might break. # NOTE: (Disabling all of them shouldn't be a problem.) + # + + // https://github.com/postfixadmin/postfixadmin/issues/299 + $domain_quota_default = Config::read('domain_quota_default'); + if ($domain_quota_default === null) { + $domain_quota_default = -1; + } $this->struct=array( # field name allow display in... type $PALANG label $PALANG description default / options / ... @@ -80,7 +87,7 @@ class DomainHandler extends PFAHandler { 'maxquota' => pacol($editquota,$editquota,$quota, 'num', 'pOverview_get_quota' , 'pAdminEdit_domain_maxquota_text' , Config::read('maxquota') ), # Domain quota - 'quota' => pacol($edit_dom_q,$edit_dom_q, 0, 'num', 'pAdminEdit_domain_quota' , 'pAdminEdit_domain_maxquota_text' , Config::read('domain_quota_default') ), + 'quota' => pacol($edit_dom_q,$edit_dom_q, 0, 'num', 'pAdminEdit_domain_quota' , 'pAdminEdit_domain_maxquota_text' , $domain_quota_default ), 'total_quota' => pacol(0, 0, 1, 'vnum', '' , '' , '', array(), array('select' => "$query_used_domainquota AS total_quota") /*extrafrom*//* already in mailbox_count */ ), 'total_quot' => pacol( 0, 0, $dom_q, 'quot', 'pAdminEdit_domain_quota' , '' , 0, array(), From 8f20c96278a694a7e0bb570f1d56c208105e5a14 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 14 Mar 2020 21:17:32 +0000 Subject: [PATCH 004/691] see: https://github.com/postfixadmin/postfixadmin/issues/101 - in Debian Buster, /var/lock is writeable by anyone, /var/run is not... both are tmpfs --- ADDITIONS/fetchmail.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ADDITIONS/fetchmail.pl b/ADDITIONS/fetchmail.pl index 916bdd81..820cc09a 100755 --- a/ADDITIONS/fetchmail.pl +++ b/ADDITIONS/fetchmail.pl @@ -27,7 +27,7 @@ our $db_username="mail"; our $db_password="CHANGE_ME!"; # Where to create a lockfile; please ensure path exists. -our $run_dir="/var/run/fetchmail"; +our $run_dir="/var/lock/fetchmail"; # in case you want to use dovecot deliver to put the mail directly into the users mailbox, # set "mda" in the fetchmail table to the keyword "dovecot". From dd52a98d4392b443f0e14cf41ebe5030315497c7 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 14 Mar 2020 21:39:36 +0000 Subject: [PATCH 005/691] prefer POST/COOKIE lang over browser http header - see: https://github.com/postfixadmin/postfixadmin/issues/28 --- functions.inc.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/functions.inc.php b/functions.inc.php index 70c6c49e..457bb94e 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -161,8 +161,25 @@ function _flash_string($type, $string) { function check_language($use_post = true) { global $supported_languages; # from languages/languages.php + // prefer a $_POST['lang'] if present + if ($use_post && safepost('lang')) { + $lang = safepost('lang'); + if(is_string($lang) && array_key_exists($lang, $supported_languages)) { + return $lang; + } + } + + // Failing that, is there a $_COOKIE['lang'] ? + if (safecookie('lang')) { + $lang = safecookie('lang'); + if(is_string($lang) && array_key_exists($lang, $supported_languages)) { + return $lang; + } + } + $lang = Config::read_string('default_language'); + // If not, did the browser give us any hint(s)? if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $lang_array = preg_split('/(\s*,\s*)/', $_SERVER['HTTP_ACCEPT_LANGUAGE']); if (safecookie('lang')) { From 48e236ffc05125bdbbb82b6e5d2c2b57832051a6 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 14 Mar 2020 22:04:54 +0000 Subject: [PATCH 006/691] use hash_equals for login - see: https://github.com/postfixadmin/postfixadmin/issues/58 --- model/PFAHandler.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/model/PFAHandler.php b/model/PFAHandler.php index c85b110d..5303f240 100644 --- a/model/PFAHandler.php +++ b/model/PFAHandler.php @@ -840,11 +840,11 @@ abstract class PFAHandler { $crypt_password = pacrypt($password, $row['password']); - if ($row['password'] == $crypt_password) { - return true; - } + return hash_equals($row['password'], $crypt_password); } - return false; + // try and be near constant time regardless of whether the db user exists or not + $x = pacrypt('abc', 'def'); + return hash_equals('not', 'comparable'); } /** From 3b9d8f867e69312c1984b069a42395061d2521e0 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 14 Mar 2020 22:30:51 +0000 Subject: [PATCH 007/691] merge sha512.b64 encrypt support - see https://github.com/postfixadmin/postfixadmin/issues/58 --- config.inc.php | 1 + functions.inc.php | 31 +++++++++++++++++++++++++++++++ tests/PacryptTest.php | 25 +++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/config.inc.php b/config.inc.php index 376bfbe3..949fe96e 100644 --- a/config.inc.php +++ b/config.inc.php @@ -194,6 +194,7 @@ $CONF['smtp_sendmail_tls'] = 'NO'; // - don't use dovecot:* methods that include the username in the hash - you won't be able to login to PostfixAdmin in this case // - you'll need at least dovecot 2.1 for salted passwords ('doveadm pw' 2.0.x doesn't support the '-t' option) // - dovecot 2.0.0 - 2.0.7 is not supported +// sha512.b64 - {SHA512-CRYPT.B64} (base64 encoded sha512) (no dovecot dependency; should support migration from md5crypt) $CONF['encrypt'] = 'md5crypt'; // In what flavor should courier-authlib style passwords be encrypted? diff --git a/functions.inc.php b/functions.inc.php index 457bb94e..4b2f9ac3 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -1232,6 +1232,8 @@ function pacrypt($pw, $pw_db="") { return _pacrypt_mysql_encrypt($pw, $pw_db); case 'authlib': return _pacrypt_authlib($pw, $pw_db); + case 'sha512.b64': + return _pacrypt_sha512_b64($pw, $pw_db); } if (preg_match("/^dovecot:/", $CONF['encrypt'])) { @@ -1245,6 +1247,35 @@ function pacrypt($pw, $pw_db="") { throw new Exception('unknown/invalid $CONF["encrypt"] setting: ' . $CONF['encrypt']); } +/** + * @see https://github.com/postfixadmin/postfixadmin/issues/58 + */ +function _pacrypt_sha512_b64($pw, $pw_db="") { + if (!function_exists('random_bytes') || !function_exists('crypt') || !defined('CRYPT_SHA512') || !function_exists('mb_substr')) { + throw new Exception("sha512.b64 not supported!"); + } + if (!$pw_db) { + $salt = mb_substr(rtrim(base64_encode(random_bytes(16)),'='),0,16,'8bit'); + return '{SHA512-CRYPT.B64}'.base64_encode(crypt($pw,'$6$'.$salt)); + } + + + $password="#Thepasswordcannotbeverified"; + if (strncmp($pw_db,'{SHA512-CRYPT.B64}',18)==0) { + $dcpwd = base64_decode(mb_substr($pw_db,18,NULL,'8bit'),true); + if ($dcpwd !== false && !empty($dcpwd) && strncmp($dcpwd,'$6$',3)==0) { + $password = '{SHA512-CRYPT.B64}'.base64_encode(crypt($pw,$dcpwd)); + } + } + elseif (strncmp($pw_db,'{MD5-CRYPT}',11)==0) { + $dcpwd = mb_substr($pw_db,11,NULL,'8bit'); + if (!empty($dcpwd) && strncmp($dcpwd,'$1$',3)==0) { + $password = '{MD5-CRYPT}'.crypt($pw,$dcpwd); + } + } + return $password; +} + /** * Creates MD5 based crypt formatted password. * If salt is not provided we generate one. diff --git a/tests/PacryptTest.php b/tests/PacryptTest.php index 24660706..6142439a 100644 --- a/tests/PacryptTest.php +++ b/tests/PacryptTest.php @@ -116,4 +116,29 @@ class PaCryptTest extends \PHPUnit\Framework\TestCase { // not impossible though. $this->assertFalse( strcmp($str1, $str2) == 0 && strcmp($str1, $str3) == 0 ); } + + public function testSha512B64() { + $str1 = _pacrypt_sha512_b64('test', ''); + $str2 = _pacrypt_sha512_b64('test', ''); + + $this->assertNotEmpty($str1); + $this->assertNotEmpty($str2); + $this->assertNotEquals($str1, $str2); // should have different salts + + + $actualHash = '{SHA512-CRYPT.B64}JDYkM2NWcFM1WFNlUHl5MzdwSiRZWW80d0FmeWg5MXpxcS4uY3dtYUR1Y1RodTJGTDY1NHpXNUNvRU0wT3hXVFFzZkxIZ1JJSTZmT281OVpDUWJOTTF2L0JXajloME0vVjJNbENNMUdwLg=='; + + $check = _pacrypt_sha512_b64('test', $actualHash); + + $this->assertTrue(hash_equals($check, $actualHash)); + + $str3 = _pacrypt_sha512_b64('foo', ''); + + $this->assertNotEmpty($str3); + + $this->assertFalse(hash_equals('test', $str3)); + + $this->assertTrue(hash_equals(_pacrypt_sha512_b64('foo',$str3), $str3)); + + } } From d6869a4d35b0cd9a46ea48dfaae0bb2ad976e509 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 14 Mar 2020 22:31:09 +0000 Subject: [PATCH 008/691] update CHANGELOG.TXT, some stuff probably missing --- CHANGELOG.TXT | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index 5d16bedb..ed9881ed 100644 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -8,7 +8,9 @@ Version X.X - master ------------------------------------------------- - + - Improve vacation.pl (better utf-8 support) + - Improve DB connections (PDO, SSL) + - Add sha512.b64 password hash support (see https://github.com/postfixadmin/postfixadmin/issues/58) - Add support for password expiration (see https://github.com/postfixadmin/postfixadmin/pull/200 and README.password_expiration ) - Improve ADDITIONS/postfixadmin-mailbox-postcreate.sh - Add Date header into smtp_from() (see https://github.com/postfixadmin/postfixadmin/issues/203 ) From 1c0fd02323d09c65070adcc936b759319cdc23db Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 14 Mar 2020 22:34:52 +0000 Subject: [PATCH 009/691] composer format time --- functions.inc.php | 17 ++++++++--------- tests/PacryptTest.php | 1 - 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/functions.inc.php b/functions.inc.php index 4b2f9ac3..5d2d2398 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -161,10 +161,10 @@ function _flash_string($type, $string) { function check_language($use_post = true) { global $supported_languages; # from languages/languages.php - // prefer a $_POST['lang'] if present + // prefer a $_POST['lang'] if present if ($use_post && safepost('lang')) { $lang = safepost('lang'); - if(is_string($lang) && array_key_exists($lang, $supported_languages)) { + if (is_string($lang) && array_key_exists($lang, $supported_languages)) { return $lang; } } @@ -172,14 +172,14 @@ function check_language($use_post = true) { // Failing that, is there a $_COOKIE['lang'] ? if (safecookie('lang')) { $lang = safecookie('lang'); - if(is_string($lang) && array_key_exists($lang, $supported_languages)) { + if (is_string($lang) && array_key_exists($lang, $supported_languages)) { return $lang; } } $lang = Config::read_string('default_language'); - // If not, did the browser give us any hint(s)? + // If not, did the browser give us any hint(s)? if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $lang_array = preg_split('/(\s*,\s*)/', $_SERVER['HTTP_ACCEPT_LANGUAGE']); if (safecookie('lang')) { @@ -1257,18 +1257,17 @@ function _pacrypt_sha512_b64($pw, $pw_db="") { if (!$pw_db) { $salt = mb_substr(rtrim(base64_encode(random_bytes(16)),'='),0,16,'8bit'); return '{SHA512-CRYPT.B64}'.base64_encode(crypt($pw,'$6$'.$salt)); - } + } $password="#Thepasswordcannotbeverified"; if (strncmp($pw_db,'{SHA512-CRYPT.B64}',18)==0) { - $dcpwd = base64_decode(mb_substr($pw_db,18,NULL,'8bit'),true); + $dcpwd = base64_decode(mb_substr($pw_db,18,null,'8bit'),true); if ($dcpwd !== false && !empty($dcpwd) && strncmp($dcpwd,'$6$',3)==0) { $password = '{SHA512-CRYPT.B64}'.base64_encode(crypt($pw,$dcpwd)); } - } - elseif (strncmp($pw_db,'{MD5-CRYPT}',11)==0) { - $dcpwd = mb_substr($pw_db,11,NULL,'8bit'); + } elseif (strncmp($pw_db,'{MD5-CRYPT}',11)==0) { + $dcpwd = mb_substr($pw_db,11,null,'8bit'); if (!empty($dcpwd) && strncmp($dcpwd,'$1$',3)==0) { $password = '{MD5-CRYPT}'.crypt($pw,$dcpwd); } diff --git a/tests/PacryptTest.php b/tests/PacryptTest.php index 6142439a..75be199d 100644 --- a/tests/PacryptTest.php +++ b/tests/PacryptTest.php @@ -139,6 +139,5 @@ class PaCryptTest extends \PHPUnit\Framework\TestCase { $this->assertFalse(hash_equals('test', $str3)); $this->assertTrue(hash_equals(_pacrypt_sha512_b64('foo',$str3), $str3)); - } } From 3303f25bccc1da5497aeee0a1e0abbd263fc7db1 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 16 Mar 2020 13:11:15 +0000 Subject: [PATCH 010/691] add some php 7+ array type hints. --- model/AliasHandler.php | 2 +- model/FetchmailHandler.php | 2 +- model/MailboxHandler.php | 2 +- model/PFAHandler.php | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/model/AliasHandler.php b/model/AliasHandler.php index 1fdf2206..dfa39e0b 100644 --- a/model/AliasHandler.php +++ b/model/AliasHandler.php @@ -254,7 +254,7 @@ class AliasHandler extends PFAHandler { } } - protected function setmore($values) { + protected function setmore(array $values) { if ($this->new) { if ($this->struct['address']['display_in_form'] == 1) { # default mode - split off 'domain' field from 'address' # TODO: do this unconditional? list(/*NULL*/, $domain) = explode('@', $values['address']); diff --git a/model/FetchmailHandler.php b/model/FetchmailHandler.php index de584dd0..182f41bb 100644 --- a/model/FetchmailHandler.php +++ b/model/FetchmailHandler.php @@ -85,7 +85,7 @@ class FetchmailHandler extends PFAHandler { } - protected function setmore($values) { + protected function setmore(array $values) { # set domain based on the target mailbox if ($this->new || isset($values['mailbox'])) { list(/*NULL*/, $domain) = explode('@', $values['mailbox']); diff --git a/model/MailboxHandler.php b/model/MailboxHandler.php index f82c7e65..e4061900 100644 --- a/model/MailboxHandler.php +++ b/model/MailboxHandler.php @@ -273,7 +273,7 @@ class MailboxHandler extends PFAHandler { // Could perhaps also use _validate_local_part($new_value) { .... } - public function set($values) { + public function set(array $values) { // See: https://github.com/postfixadmin/postfixadmin/issues/282 - ensure the 'local_part' does not contain an @ sign. $ok = true; if (isset($values['local_part']) && strpos($values['local_part'], '@')) { diff --git a/model/PFAHandler.php b/model/PFAHandler.php index 5303f240..aaafddac 100644 --- a/model/PFAHandler.php +++ b/model/PFAHandler.php @@ -418,7 +418,7 @@ abstract class PFAHandler { * @return bool - true if all values are valid, otherwise false * error messages (if any) are stored in $this->errormsg */ - public function set($values) { + public function set(array $values) { if (!$this->can_edit) { $this->errormsg[] = Config::Lang_f('edit_not_allowed', $this->label); return false; @@ -521,7 +521,7 @@ abstract class PFAHandler { * can be used to update additional columns etc. * hint: modify $this->values and $this->errormsg directly as needed */ - protected function setmore($values) { + protected function setmore(array $values) { # do nothing } From d540d904dbabcc40a0049f1a0eb3a3504064d847 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 16 Mar 2020 13:11:51 +0000 Subject: [PATCH 011/691] cast mailbox['quota'] to be integer. see: https://github.com/postfixadmin/postfixadmin/issues/342 --- model/MailboxHandler.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/model/MailboxHandler.php b/model/MailboxHandler.php index e4061900..cb5b898e 100644 --- a/model/MailboxHandler.php +++ b/model/MailboxHandler.php @@ -271,6 +271,11 @@ class MailboxHandler extends PFAHandler { return true; } + protected function setmore(array $values) { + if(array_key_exists('quota', $this->values)) { + $this->values['quota'] = (int)$this->values['quota']; + } + } // Could perhaps also use _validate_local_part($new_value) { .... } public function set(array $values) { From d3295a59bb352cfcf61d1ab36fb4e2489a9019fa Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 16 Mar 2020 14:10:05 +0000 Subject: [PATCH 012/691] format --- model/MailboxHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/MailboxHandler.php b/model/MailboxHandler.php index cb5b898e..b5ee2551 100644 --- a/model/MailboxHandler.php +++ b/model/MailboxHandler.php @@ -272,7 +272,7 @@ class MailboxHandler extends PFAHandler { } protected function setmore(array $values) { - if(array_key_exists('quota', $this->values)) { + if (array_key_exists('quota', $this->values)) { $this->values['quota'] = (int)$this->values['quota']; } } From 338fb8c5644d3186c26232d0c1e85a4375b20386 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Wed, 18 Mar 2020 14:36:53 +0000 Subject: [PATCH 013/691] Fix quota storage; see https://github.com/postfixadmin/postfixadmin/issues/342 --- model/MailboxHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/MailboxHandler.php b/model/MailboxHandler.php index b5ee2551..826eff72 100644 --- a/model/MailboxHandler.php +++ b/model/MailboxHandler.php @@ -206,7 +206,7 @@ class MailboxHandler extends PFAHandler { protected function read_from_db_postprocess($db_result) { foreach ($db_result as $key => $row) { - if (isset($row['quota']) && !empty($row['quota'])) { # quota could be disabled in $struct + if (isset($row['quota']) && is_numeric($row['quota']) && $row['quota'] > -1) { # quota could be disabled in $struct $db_result[$key]['quotabytes'] = $row['quota']; $db_result[$key]['quota'] = divide_quota($row['quota']); # convert quota to MB } else { From d81363541ab77d07887237a6cc7b3054437def34 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Wed, 18 Mar 2020 21:03:27 +0000 Subject: [PATCH 014/691] fix psalm --- model/MailboxHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/MailboxHandler.php b/model/MailboxHandler.php index 826eff72..05a3deaf 100644 --- a/model/MailboxHandler.php +++ b/model/MailboxHandler.php @@ -208,7 +208,7 @@ class MailboxHandler extends PFAHandler { foreach ($db_result as $key => $row) { if (isset($row['quota']) && is_numeric($row['quota']) && $row['quota'] > -1) { # quota could be disabled in $struct $db_result[$key]['quotabytes'] = $row['quota']; - $db_result[$key]['quota'] = divide_quota($row['quota']); # convert quota to MB + $db_result[$key]['quota'] = divide_quota( (int) $row['quota']); # convert quota to MB } else { $db_result[$key]['quotabytes'] = -1; $db_result[$key]['quota'] = -1; From 4d10a2c4bb075d8bc27ca5df82801c7611d9b0aa Mon Sep 17 00:00:00 2001 From: Christian Boltz Date: Wed, 1 Apr 2020 20:37:40 +0200 Subject: [PATCH 015/691] remove obsolete translation markers from tr.lang --- languages/tr.lang | 430 +++++++++++++++++++++++----------------------- 1 file changed, 215 insertions(+), 215 deletions(-) diff --git a/languages/tr.lang b/languages/tr.lang index ab0b0b42..29c146c8 100644 --- a/languages/tr.lang +++ b/languages/tr.lang @@ -9,48 +9,48 @@ $PALANG['YES'] = 'EVET'; $PALANG['NO'] = 'HAYIR'; $PALANG['edit'] = 'düzenle'; $PALANG['del'] = 'sil'; -$PALANG['exit'] = 'Çıkış'; # XXX -$PALANG['cancel'] = 'İptal'; # XXX -$PALANG['save'] = 'Değişiklikleri kaydet'; # XXX +$PALANG['exit'] = 'Çıkış'; +$PALANG['cancel'] = 'İptal'; +$PALANG['save'] = 'Değişiklikleri kaydet'; $PALANG['confirm'] = 'Bunu silmek istediğinizden emin misiniz?\n'; -$PALANG['confirm_delete_admin'] = 'Şu yöneticiyi silmek istediğinizden emin misiniz: %s?'; # XXX -$PALANG['confirm_delete_alias'] = 'Şu yönlendirmeyi silmek istediğinizden emin misiniz: %s?'; # XXX -$PALANG['confirm_delete_aliasdomain'] = 'Şu yönlendirme domainini silmek istediğinizden emin misiniz: %s?'; # XXX +$PALANG['confirm_delete_admin'] = 'Şu yöneticiyi silmek istediğinizden emin misiniz: %s?'; +$PALANG['confirm_delete_alias'] = 'Şu yönlendirmeyi silmek istediğinizden emin misiniz: %s?'; +$PALANG['confirm_delete_aliasdomain'] = 'Şu yönlendirme domainini silmek istediğinizden emin misiniz: %s?'; $PALANG['confirm_delete_domain'] = 'Bu domain için tüm kayıtları silmek istediğinizden emin misiniz? Bu işlem geri alınamaz!\n (%s)'; # XXX text changed to: 'Do you really want to delete all records for the domain %s? This can not be undone' -$PALANG['confirm_delete_fetchmail'] = 'Bu e-posta yakalama işlerini silmek istediğinizden emin misiniz: %s?'; # XXX -$PALANG['confirm_delete_mailbox'] = 'Bu e-posta kutusunu silmek istediğinizden emin misiniz: %s?'; # XXX -$PALANG['confirm_delete_vacation'] = 'Bu hesap için otomatik tatil mesajlarını silmek istediğinizden emin misiniz: %s?'; # XXX -$PALANG['no_delete_permissions'] = 'Silmeye yetkiniz yok: %s!'; # XXX -$PALANG['check_update'] = 'Güncelleştirmeleri denetleyin'; # XXX -$PALANG['invalid_parameter'] = 'Geçersiz parametre!'; # XXX -$PALANG['show'] = 'Göster:'; # XXX -$PALANG['all'] = 'Tümü'; # XXX -$PALANG['created'] = 'Oluşturuldu'; # XXX -$PALANG['unknown'] = 'bilinmeyen'; # XXX -$PALANG['download_csv'] = 'Bu listeyi CSV dosyası olarak indirin'; # XXX -$PALANG['missing_field'] = 'Girilmesi gereken alan %s boş'; # XXX -$PALANG['must_be_numeric'] = '%s rakamlardan oluşmalı'; # XXX -$PALANG['must_be_numeric_bigger_than_null'] = '%s rakamlardan oluşmalı ve sıfırdan büyük olmalı'; # XXX -$PALANG['must_be_boolean'] = '%s girilen değer boolean olmalı'; # XXX -$PALANG['invalid_value_given'] = '%s için girilen değer yanlış'; # XXX -$PALANG['edit_not_allowed'] = 'Düzenlemeye yetkiniz yok: %s'; # XXX -$PALANG['searchparams'] = 'Arama parametreleri:'; # XXX -$PALANG['pFooter_logged_as'] = 'Giriş yapılan kullanıcı: %s'; # XXX +$PALANG['confirm_delete_fetchmail'] = 'Bu e-posta yakalama işlerini silmek istediğinizden emin misiniz: %s?'; +$PALANG['confirm_delete_mailbox'] = 'Bu e-posta kutusunu silmek istediğinizden emin misiniz: %s?'; +$PALANG['confirm_delete_vacation'] = 'Bu hesap için otomatik tatil mesajlarını silmek istediğinizden emin misiniz: %s?'; +$PALANG['no_delete_permissions'] = 'Silmeye yetkiniz yok: %s!'; +$PALANG['check_update'] = 'Güncelleştirmeleri denetleyin'; +$PALANG['invalid_parameter'] = 'Geçersiz parametre!'; +$PALANG['show'] = 'Göster:'; +$PALANG['all'] = 'Tümü'; +$PALANG['created'] = 'Oluşturuldu'; +$PALANG['unknown'] = 'bilinmeyen'; +$PALANG['download_csv'] = 'Bu listeyi CSV dosyası olarak indirin'; +$PALANG['missing_field'] = 'Girilmesi gereken alan %s boş'; +$PALANG['must_be_numeric'] = '%s rakamlardan oluşmalı'; +$PALANG['must_be_numeric_bigger_than_null'] = '%s rakamlardan oluşmalı ve sıfırdan büyük olmalı'; +$PALANG['must_be_boolean'] = '%s girilen değer boolean olmalı'; +$PALANG['invalid_value_given'] = '%s için girilen değer yanlış'; +$PALANG['edit_not_allowed'] = 'Düzenlemeye yetkiniz yok: %s'; +$PALANG['searchparams'] = 'Arama parametreleri:'; +$PALANG['pFooter_logged_as'] = 'Giriş yapılan kullanıcı: %s'; $PALANG['pLogin_welcome'] = 'E-Posta Yöneticileri, buradan domainlerinizi yönetmek için giriş yapabilirsiniz.'; $PALANG['pLogin_username'] = 'Kullanıcı adı (e-posta)'; # # XXX check translation - should be "Login (email)" $PALANG['password'] = 'Şifre'; # XXX compare with pUsersLogin_password - should be "Password" -$PALANG['pLogin_language'] = 'Dil'; # XXX +$PALANG['pLogin_language'] = 'Dil'; $PALANG['pLogin_button'] = 'Giriş'; # XXX compare with pUsersLogin_button - should be "Login" -$PALANG['pLogin_failed'] = 'E-posta adresiniz veya şifreniz yanlış.'; # XXX +$PALANG['pLogin_failed'] = 'E-posta adresiniz veya şifreniz yanlış.'; $PALANG['pLogin_login_users'] = 'Kullanıcı işlemlerine girmek için burayı kullanınız.'; -$PALANG['pMenu_main'] = 'Ana'; # XXX +$PALANG['pMenu_main'] = 'Ana'; $PALANG['pMenu_overview'] = 'Genel Bilgiler'; $PALANG['add_alias'] = 'Alias Ekle'; -$PALANG['add_alias_domain'] = 'Alias Domain Kaydı Ekle'; # XXX +$PALANG['add_alias_domain'] = 'Alias Domain Kaydı Ekle'; $PALANG['add_mailbox'] = 'E-posta kutusu ekle'; -$PALANG['pMenu_fetchmail'] = 'E-posta Yakala'; # XXX +$PALANG['pMenu_fetchmail'] = 'E-posta Yakala'; $PALANG['pMenu_sendmail'] = 'E-posta Gönder'; $PALANG['pMenu_password'] = 'Şifre'; $PALANG['pMenu_viewlog'] = 'Logları İncele'; @@ -65,67 +65,67 @@ $PALANG['pMain_password'] = 'Yönetici hesabınızın şifresini değiştirin.'; $PALANG['pMain_viewlog'] = 'log dosyalarını inceleyin.'; $PALANG['pMain_logout'] = 'Sistemden çıkın.'; -$PALANG['pOverview_disabled'] = 'Kapalı'; # XXX -$PALANG['pOverview_unlimited'] = 'Sınırsız'; # XXX -$PALANG['pOverview_title'] = ':: Tanımlı Domainler'; # XXX -$PALANG['pOverview_up_arrow'] = 'En Üste Git'; # XXX -$PALANG['pOverview_right_arrow'] = 'Sonraki Sayfa'; # XXX -$PALANG['pOverview_left_arrow'] = 'Önceki Sayfa'; # XXX -$PALANG['pOverview_alias_domain_title'] = ':: Domain Aliasları'; # XXX +$PALANG['pOverview_disabled'] = 'Kapalı'; +$PALANG['pOverview_unlimited'] = 'Sınırsız'; +$PALANG['pOverview_title'] = ':: Tanımlı Domainler'; +$PALANG['pOverview_up_arrow'] = 'En Üste Git'; +$PALANG['pOverview_right_arrow'] = 'Sonraki Sayfa'; +$PALANG['pOverview_left_arrow'] = 'Önceki Sayfa'; +$PALANG['pOverview_alias_domain_title'] = ':: Domain Aliasları'; $PALANG['pOverview_alias_title'] = ':: Alias'; # XXX -$PALANG['pOverview_mailbox_title'] = ':: E-posta Kutuları'; # XXX +$PALANG['pOverview_mailbox_title'] = ':: E-posta Kutuları'; $PALANG['go'] = 'Git'; $PALANG['pOverview_welcome'] = 'Genel Bilgiler: '; -$PALANG['pOverview_alias_domain_aliases'] = 'Alias Domainleri'; # XXX +$PALANG['pOverview_alias_domain_aliases'] = 'Alias Domainleri'; $PALANG['pOverview_alias_address'] = 'Kimden'; $PALANG['active'] = 'Aktif'; -$PALANG['and_x_more'] = '[ve %s daha fazla...]'; # XXX +$PALANG['and_x_more'] = '[ve %s daha fazla...]'; $PALANG['pOverview_mailbox_username'] = 'E-posta'; $PALANG['name'] = 'İsim'; $PALANG['pOverview_mailbox_quota'] = 'Kota (MB)'; -$PALANG['pOverview_vacation_edit'] = 'TATİL MODU AÇIK'; # XXX -$PALANG['pOverview_vacation_option'] = 'Tatil Modu Ayarla'; # XXX -$PALANG['no_domains_for_this_admin'] = 'Herhangi bir domain için yetkiniz yok.'; # XXX -$PALANG['no_domains_exist'] = 'Sanal liste kullanabilmeniz için en az bir domain oluşturmalısınız.'; # "virtual list" should match $PALANG['pAdminMenu_list_virtual'] # XXX +$PALANG['pOverview_vacation_edit'] = 'TATİL MODU AÇIK'; +$PALANG['pOverview_vacation_option'] = 'Tatil Modu Ayarla'; +$PALANG['no_domains_for_this_admin'] = 'Herhangi bir domain için yetkiniz yok.'; +$PALANG['no_domains_exist'] = 'Sanal liste kullanabilmeniz için en az bir domain oluşturmalısınız.'; # "virtual list" should match $PALANG['pAdminMenu_list_virtual'] $PALANG['domain'] = 'Domain'; -$PALANG['pOverview_get_alias_domains'] = 'Domain Aliasları'; # XXX +$PALANG['pOverview_get_alias_domains'] = 'Domain Aliasları'; $PALANG['mailboxes'] = 'E-Posta Kutuları'; # XXX check / compare with pAdminCreate_domain_mailboxes - should be "Mailboxes" $PALANG['pOverview_get_quota'] = 'E-Posta Kutusu Kotası (MB)'; $PALANG['pDelete_delete_error'] = 'Kayıt silinemiyor '; -$PALANG['pDelete_delete_success'] = '%s silindi.'; # XXX +$PALANG['pDelete_delete_success'] = '%s silindi.'; $PALANG['pDelete_domain_error'] = 'Bu domain size ait değil '; -$PALANG['pDelete_alias_error'] = 'Alias kaydı silinemedi '; # XXX -$PALANG['pCreate_alias_domain_welcome'] = 'Bir domaininizin, bir diğerine yansıyan adresleri.'; # XXX -$PALANG['pCreate_alias_domain_alias'] = 'Domain Aliasları'; # XXX -$PALANG['pCreate_alias_domain_alias_text'] = 'Gelen e-postaların domain adresi.'; # XXX -$PALANG['pCreate_alias_domain_target'] = 'Hedef Domain'; # XXX -$PALANG['pCreate_alias_domain_target_text'] = 'E-postaların gideceği domain adresi.'; # XXX -$PALANG['pCreate_alias_domain_error1'] = 'Seçtiğiniz konfigürasyonu oluşturma yetkiniz yok.'; # XXX -$PALANG['pCreate_alias_domain_error2'] = 'Seçtiğiniz konfigürasyon geçersiz, lütfen bir başka seçim yapınız!'; # XXX -$PALANG['alias_domain_already_exists'] = 'Bu domain, zaten bir alias domain!'; # XXX -$PALANG['alias_domain_does_not_exist'] = 'Bu domain bir alias domain değil!'; # XXX -$PALANG['alias_domain_create_failed'] = 'Belirtilen alias domain %s oluşturulamadı!'; # XXX -$PALANG['alias_domain_change_failed'] = 'Alias domain %s değişiklikleri yapılamadı!'; # XXX -$PALANG['pCreate_alias_domain_error4'] = 'Tüm domainler zaten aliaslı şekilde.'; # XXX -$PALANG['pCreate_alias_domain_success'] = 'Alias domain %s oluşturuldu.'; # XXX -$PALANG['alias_domain_changed'] = 'Alias domain %s değiştirildi.'; # XXX -$PALANG['alias_domain_to_itsself'] = 'Bir domain, kendi alias domaini olamaz!'; # XXX -$PALANG['delete_domain_aliasdomain_target'] = 'Domaininiz %s bir veya birden fazla alias domaini olarak kayıtlı, ve silinemez. (Öncelikle alias domainleri siliniz.)'; # XXX +$PALANG['pDelete_alias_error'] = 'Alias kaydı silinemedi '; +$PALANG['pCreate_alias_domain_welcome'] = 'Bir domaininizin, bir diğerine yansıyan adresleri.'; +$PALANG['pCreate_alias_domain_alias'] = 'Domain Aliasları'; +$PALANG['pCreate_alias_domain_alias_text'] = 'Gelen e-postaların domain adresi.'; +$PALANG['pCreate_alias_domain_target'] = 'Hedef Domain'; +$PALANG['pCreate_alias_domain_target_text'] = 'E-postaların gideceği domain adresi.'; +$PALANG['pCreate_alias_domain_error1'] = 'Seçtiğiniz konfigürasyonu oluşturma yetkiniz yok.'; +$PALANG['pCreate_alias_domain_error2'] = 'Seçtiğiniz konfigürasyon geçersiz, lütfen bir başka seçim yapınız!'; +$PALANG['alias_domain_already_exists'] = 'Bu domain, zaten bir alias domain!'; +$PALANG['alias_domain_does_not_exist'] = 'Bu domain bir alias domain değil!'; +$PALANG['alias_domain_create_failed'] = 'Belirtilen alias domain %s oluşturulamadı!'; +$PALANG['alias_domain_change_failed'] = 'Alias domain %s değişiklikleri yapılamadı!'; +$PALANG['pCreate_alias_domain_error4'] = 'Tüm domainler zaten aliaslı şekilde.'; +$PALANG['pCreate_alias_domain_success'] = 'Alias domain %s oluşturuldu.'; +$PALANG['alias_domain_changed'] = 'Alias domain %s değiştirildi.'; +$PALANG['alias_domain_to_itsself'] = 'Bir domain, kendi alias domaini olamaz!'; +$PALANG['delete_domain_aliasdomain_target'] = 'Domaininiz %s bir veya birden fazla alias domaini olarak kayıtlı, ve silinemez. (Öncelikle alias domainleri siliniz.)'; $PALANG['pCreate_alias_address_text_error1'] = 'ALIAS uygun değil!'; -$PALANG['alias_does_not_exist'] = 'Bu alias mevcut değil!'; # XXX +$PALANG['alias_does_not_exist'] = 'Bu alias mevcut değil!'; $PALANG['email_address_already_exists'] = 'Bu e-posta zaten kullanılıyor, lütfen başka bir tane seçin!'; # XXX check text - should be 'This email address already exists, please choose a different one\!' $PALANG['pCreate_alias_address_text_error3'] = 'Alias limitine ulaştınız!'; $PALANG['pCreate_alias_goto_text'] = 'E-postanın gitmesi gereken yer.'; $PALANG['pCreate_alias_goto_text_error'] = 'Kime alanı uygun değil!'; $PALANG['pCreate_alias_result_error'] = 'Belirtilen alias oluşturulamadı! (%s)'; # XXX Text changed to: Creating the alias %s failed! $PALANG['pCreate_alias_result_success'] = '%s aliasınız oluşturuldu!'; # XXX text change: 'The alias %s has been created!' -$PALANG['alias_updated'] = '%s aliasınız güncellendi!'; # XXX +$PALANG['alias_updated'] = '%s aliasınız güncellendi!'; $PALANG['pCreate_alias_catchall_text'] = 'Tümünü-yakala oluşturmak için alias olarak "*" kullanın. Domain yönlendirme domaini için kime kısmında "*@domain.tld" kullanın.'; # XXX check/beautify - was split in two lines before -$PALANG['mailbox_alias_cant_be_deleted'] = 'Bu alias, sistemde kayıtlı bir e-posta hesabına ait ve silinemez!'; # XXX -$PALANG['protected_alias_cant_be_deleted'] = '%s isimli alias korumalı olarak ayarlı ve ancak bir süper yönetici tarafından silinebilir'; # XXX +$PALANG['mailbox_alias_cant_be_deleted'] = 'Bu alias, sistemde kayıtlı bir e-posta hesabına ait ve silinemez!'; +$PALANG['protected_alias_cant_be_deleted'] = '%s isimli alias korumalı olarak ayarlı ve ancak bir süper yönetici tarafından silinebilir'; $PALANG['pEdit_alias_welcome'] = 'Yönlendirme ayarlarını düzenleyin. '; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Her bir satıra bir giriş şeklinde, çoklu hedefler kabul edilir.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' @@ -133,34 +133,34 @@ $PALANG['alias'] = 'Alias'; $PALANG['to'] = 'Kime'; # XXX check text - should be 'To' $PALANG['pEdit_alias_goto_text_error1'] = 'Kime kısmına hiçbir şey girmediniz.'; $PALANG['pEdit_alias_goto_text_error2'] = 'Girdiğiniz e-posta uygun değil: '; -$PALANG['pEdit_alias_domain_result_error'] = 'Alias domain düzenlenemedi!'; # XXX -$PALANG['pEdit_alias_forward_and_store'] = 'Yerel bir e-posta hesabına ulaştır.'; # XXX -$PALANG['pEdit_alias_forward_only'] = 'Sadece belirtilen e-posta adreslerine yönlendirin.'; # XXX +$PALANG['pEdit_alias_domain_result_error'] = 'Alias domain düzenlenemedi!'; +$PALANG['pEdit_alias_forward_and_store'] = 'Yerel bir e-posta hesabına ulaştır.'; +$PALANG['pEdit_alias_forward_only'] = 'Sadece belirtilen e-posta adreslerine yönlendirin.'; $PALANG['pEdit_alias_result_error'] = 'Alias düzenlenemiyor! (%s)'; # XXX Text changed to: Modifying the alias %s failed! $PALANG['pCreate_mailbox_welcome'] = 'Domaininiz için yeni bir lokal e-posta yaratın.'; -$PALANG['pCreate_mailbox_local_part_error'] = '@ işaretinden önce değer belirtilmeli.'; # XXX +$PALANG['pCreate_mailbox_local_part_error'] = '@ işaretinden önce değer belirtilmeli.'; $PALANG['pCreate_mailbox_username_text_error1'] = 'E-posta uygun değil!'; $PALANG['pCreate_mailbox_username_text_error3'] = 'E-posta kutusu yaratma limitinize eriştiniz!'; $PALANG['pCreate_mailbox_password_text'] = 'POP3/IMAP için şifre'; $PALANG['pCreate_mailbox_name_text'] = 'Tam isim'; -$PALANG['pCreate_mailbox_phone'] = 'Cep telefonu'; # XXX -$PALANG['pCreate_mailbox_phone_desc'] = "Şifrenizi unuttuğunuz durumlarda SMS gönderilmesi için"; # XXX -$PALANG['pCreate_mailbox_email'] = 'Diğer e-posta'; # XXX -$PALANG['pCreate_mailbox_email_desc'] = "Şifrenizi unuttuğunuzda kullanılması için"; # XXX +$PALANG['pCreate_mailbox_phone'] = 'Cep telefonu'; +$PALANG['pCreate_mailbox_phone_desc'] = "Şifrenizi unuttuğunuz durumlarda SMS gönderilmesi için"; +$PALANG['pCreate_mailbox_email'] = 'Diğer e-posta'; +$PALANG['pCreate_mailbox_email_desc'] = "Şifrenizi unuttuğunuzda kullanılması için"; $PALANG['pCreate_mailbox_mail'] = 'Hoş Geldin e-posta iletisi gönder'; # XXX Text change to 'Send Welcome mail' $PALANG['pCreate_mailbox_result_error'] = 'E-posta hesabı oluşturulamadı: %s'; # XXX Text changed to: Creating the mailbox %s failed! $PALANG['pCreate_mailbox_result_success'] = 'E-posta hesabı, e-posta tablolarına eklendi! (%s)'; # XXX Text changed to: The mailbox %s has been added to the mailbox table! -$PALANG['pCreate_mailbox_result_succes_nosubfolders'] = 'E-posta hesabı %s e-posta tablolar listesine kaydedildi, fakat hiçbir (veya bir takım) ön tanımlı alt-klasörler oluşturulamadı.'; # XXX -$PALANG['mailbox_updated'] = "E-posta hesabı %s güncelleştirildi."; # XXX -$PALANG['mailbox_update_failed'] = "E-posta hesabının güncelleştirilmesi başarısız: %s"; # XXX +$PALANG['pCreate_mailbox_result_succes_nosubfolders'] = 'E-posta hesabı %s e-posta tablolar listesine kaydedildi, fakat hiçbir (veya bir takım) ön tanımlı alt-klasörler oluşturulamadı.'; +$PALANG['mailbox_updated'] = "E-posta hesabı %s güncelleştirildi."; +$PALANG['mailbox_update_failed'] = "E-posta hesabının güncelleştirilmesi başarısız: %s"; $PALANG['pEdit_mailbox_welcome'] = 'Domaininize ait bir e-posta kutusunu düzenleyin.'; $PALANG['pEdit_mailbox_username'] = 'Kullanıcı adı'; # XXX check / compare with pCreate_mailbox_username - should be "Username" $PALANG['pEdit_mailbox_password_text_error'] = 'Verdiğiniz şifreler birbirini tutmuyor!'; $PALANG['pEdit_mailbox_quota'] = 'Kota'; $PALANG['pEdit_mailbox_quota_text'] = 'MB'; -$PALANG['mb_max'] = 'MB (maks: %s)'; # XXX +$PALANG['mb_max'] = 'MB (maks: %s)'; $PALANG['pEdit_mailbox_quota_text_error'] = 'Verdiğiniz kota çok yüksek!'; $PALANG['pEdit_mailbox_domain_error'] = 'Bu domain dizin değil: '; $PALANG['pEdit_mailbox_result_error'] = 'Şifre değiştirilemedi!'; @@ -175,55 +175,55 @@ $PALANG['pPassword_password_text_error'] = 'Girdiğiniz şifreler birbirini tutm $PALANG['change_password'] = 'Şifreyi değiştir'; # XXX check text - should be 'Change Password' $PALANG['pPassword_result_error'] = 'Şifreniz değiştirilemedi! (%s)'; # XXX Text changed to: Changing the password for %s failed! $PALANG['pPassword_result_success'] = 'Şifreniz değiştirildi! (%s)'; # XXX Text changed to: The password for %s has been changed. -$PALANG['pPassword_recovery_title'] = 'Şifrenizi sıfırlamak için yönergeleri izleyin.'; # XXX -$PALANG['pPassword_recovery_button'] = 'Bana kodu gönder'; # XXX -$PALANG['pPassword_recovery_email_body'] = "Merhaba,\n\nE-posta hesabınızın şifresini değiştirmek için şu linki kullanın: \n%s\n\nSaygılarımızla,\n\n" . $CONF['admin_name']; # XXX -$PALANG['pPassword_recovery_sms_body'] = "Merhaba,\nŞifrenizi değiştirebilmeniz için gerekli kod: %s\n" . $CONF['admin_name']; # XXX -$PALANG['pPassword_recovery_processed'] = "Talebiniz gerçekleştirildi. Şayet geçerli bir kullanıcı adı girdiyseniz, şifre kodunuzu e-posta veya SMS ile alacaksınız."; # XXX -$PALANG['pPassword_password_code'] = 'Kod tarafınıza e-posta veya SMS yoluyla gönderildi'; # XXX -$PALANG['pPassword_code_text_error'] = 'Geçersiz kod'; # XXX -$PALANG['pEdit_vacation_set'] = 'Meşgul mesajı oluştur / değiştir'; # XXX -$PALANG['pEdit_vacation_remove'] = 'Meşgul mesajını kaldır'; # XXX -$PALANG['pVacation_result_error'] = 'Otomatik yanıt ayarları düzenlenemedi: %s'; # XXX -$PALANG['pVacation_result_removed'] = 'Otomatik yanıt sistemi kapatılmış: %s'; # XXX -$PALANG['pVacation_result_added'] = 'Otomatik yanıt sistemi aktifleştirildi: %s'; # XXX -$PALANG['pVacation_reply_type'] = 'Yanıt biçimi'; # XXX -$PALANG['pVacation_reply_delay_time'] = 'Zaman aralığı'; # XXX -$PALANG['pVacation_reply_delay_time_text'] = 'Saniye bazında zaman'; # XXX -$PALANG['pVacation_until_before_today'] = '[Aktiflik Süresi] tarihi, bugünden daha erken bir güne kayıtlı'; # XXX -$PALANG['pVacation_until_before_from'] = '[Aktif Olma Süresi] tarihi, [İtibariyle Aktif] tarihinden öncesi bir tarihe kayıtlı'; # XXX -$PALANG['reply_once'] = 'Bir kez yanıtla'; # XXX -$PALANG['reply_every_mail'] = 'Her e-posta iletisinde yanıtla'; # XXX -$PALANG['reply_once_per_day'] = 'Günde bir kez yanıtla'; # XXX -$PALANG['reply_once_per_week'] = 'Haftada bir kez yanıtla'; # XXX +$PALANG['pPassword_recovery_title'] = 'Şifrenizi sıfırlamak için yönergeleri izleyin.'; +$PALANG['pPassword_recovery_button'] = 'Bana kodu gönder'; +$PALANG['pPassword_recovery_email_body'] = "Merhaba,\n\nE-posta hesabınızın şifresini değiştirmek için şu linki kullanın: \n%s\n\nSaygılarımızla,\n\n" . $CONF['admin_name']; +$PALANG['pPassword_recovery_sms_body'] = "Merhaba,\nŞifrenizi değiştirebilmeniz için gerekli kod: %s\n" . $CONF['admin_name']; +$PALANG['pPassword_recovery_processed'] = "Talebiniz gerçekleştirildi. Şayet geçerli bir kullanıcı adı girdiyseniz, şifre kodunuzu e-posta veya SMS ile alacaksınız."; +$PALANG['pPassword_password_code'] = 'Kod tarafınıza e-posta veya SMS yoluyla gönderildi'; +$PALANG['pPassword_code_text_error'] = 'Geçersiz kod'; +$PALANG['pEdit_vacation_set'] = 'Meşgul mesajı oluştur / değiştir'; +$PALANG['pEdit_vacation_remove'] = 'Meşgul mesajını kaldır'; +$PALANG['pVacation_result_error'] = 'Otomatik yanıt ayarları düzenlenemedi: %s'; +$PALANG['pVacation_result_removed'] = 'Otomatik yanıt sistemi kapatılmış: %s'; +$PALANG['pVacation_result_added'] = 'Otomatik yanıt sistemi aktifleştirildi: %s'; +$PALANG['pVacation_reply_type'] = 'Yanıt biçimi'; +$PALANG['pVacation_reply_delay_time'] = 'Zaman aralığı'; +$PALANG['pVacation_reply_delay_time_text'] = 'Saniye bazında zaman'; +$PALANG['pVacation_until_before_today'] = '[Aktiflik Süresi] tarihi, bugünden daha erken bir güne kayıtlı'; +$PALANG['pVacation_until_before_from'] = '[Aktif Olma Süresi] tarihi, [İtibariyle Aktif] tarihinden öncesi bir tarihe kayıtlı'; +$PALANG['reply_once'] = 'Bir kez yanıtla'; +$PALANG['reply_every_mail'] = 'Her e-posta iletisinde yanıtla'; +$PALANG['reply_once_per_day'] = 'Günde bir kez yanıtla'; +$PALANG['reply_once_per_week'] = 'Haftada bir kez yanıtla'; $PALANG['pViewlog_welcome'] = 'Son %s hareketi:'; -$PALANG['pViewlog_timestamp'] = 'Timestamp'; +$PALANG['pViewlog_timestamp'] = 'Timestamp'; # XXX $PALANG['pViewlog_action'] = 'Hareket'; $PALANG['pViewlog_data'] = 'Veri'; -$PALANG['pViewlog_action_create_domain'] = 'domain oluştur'; # XXX -$PALANG['pViewlog_action_delete_domain'] = 'domain sil'; # XXX -$PALANG['pViewlog_action_edit_domain'] = 'domain düzenle'; # XXX -$PALANG['pViewlog_action_create_mailbox'] = 'e-posta kutusu oluştur'; # XXX -$PALANG['pViewlog_action_delete_mailbox'] = 'e-posta kutusu sil'; # XXX -$PALANG['pViewlog_action_edit_mailbox'] = 'e-posta kutusu düzenle'; # XXX -$PALANG['pViewlog_action_edit_mailbox_state'] = 'e-posta kutusunu aktifleştir'; # XXX -$PALANG['pViewlog_action_create_alias'] = 'alias oluştur'; # XXX -$PALANG['pViewlog_action_create_alias_domain'] = 'domain aliası oluştur'; # XXX -$PALANG['pViewlog_action_edit_alias_domain'] = 'domain aliası düzenle'; # XXX -$PALANG['pViewlog_action_delete_alias'] = 'alias sil'; # XXX -$PALANG['pViewlog_action_delete_alias_domain'] = 'domain aliası sil'; # XXX -$PALANG['pViewlog_action_edit_alias'] = 'alias düzenle'; # XXX -$PALANG['pViewlog_action_edit_alias_state'] = 'aliası aktifleştir'; # XXX -$PALANG['pViewlog_action_edit_alias_domain_state'] = 'domain aliası aktifleştir'; # XXX -$PALANG['pViewlog_action_edit_password'] = 'şifreyi değiştir'; # XXX -$PALANG['pViewlog_action_create_admin'] = 'yönetici oluştur'; # XXX -$PALANG['pViewlog_action_edit_admin'] = 'yönetici düzenle'; # XXX -$PALANG['pViewlog_action_delete_admin'] = 'yönetici sil'; # XXX -$PALANG['pViewlog_action_edit_vacation'] = 'tatil düzenle'; # XXX -$PALANG['pViewlog_action_create_fetchmail'] = 'tümünü-yakala oluştur'; # XXX -$PALANG['pViewlog_action_edit_fetchmail'] = 'tümünü-yakala iş düzenle'; # XXX -$PALANG['pViewlog_action_delete_fetchmail'] = 'tümünü-yakala sil'; # XXX +$PALANG['pViewlog_action_create_domain'] = 'domain oluştur'; +$PALANG['pViewlog_action_delete_domain'] = 'domain sil'; +$PALANG['pViewlog_action_edit_domain'] = 'domain düzenle'; +$PALANG['pViewlog_action_create_mailbox'] = 'e-posta kutusu oluştur'; +$PALANG['pViewlog_action_delete_mailbox'] = 'e-posta kutusu sil'; +$PALANG['pViewlog_action_edit_mailbox'] = 'e-posta kutusu düzenle'; +$PALANG['pViewlog_action_edit_mailbox_state'] = 'e-posta kutusunu aktifleştir'; +$PALANG['pViewlog_action_create_alias'] = 'alias oluştur'; +$PALANG['pViewlog_action_create_alias_domain'] = 'domain aliası oluştur'; +$PALANG['pViewlog_action_edit_alias_domain'] = 'domain aliası düzenle'; +$PALANG['pViewlog_action_delete_alias'] = 'alias sil'; +$PALANG['pViewlog_action_delete_alias_domain'] = 'domain aliası sil'; +$PALANG['pViewlog_action_edit_alias'] = 'alias düzenle'; +$PALANG['pViewlog_action_edit_alias_state'] = 'aliası aktifleştir'; +$PALANG['pViewlog_action_edit_alias_domain_state'] = 'domain aliası aktifleştir'; +$PALANG['pViewlog_action_edit_password'] = 'şifreyi değiştir'; +$PALANG['pViewlog_action_create_admin'] = 'yönetici oluştur'; +$PALANG['pViewlog_action_edit_admin'] = 'yönetici düzenle'; +$PALANG['pViewlog_action_delete_admin'] = 'yönetici sil'; +$PALANG['pViewlog_action_edit_vacation'] = 'tatil düzenle'; +$PALANG['pViewlog_action_create_fetchmail'] = 'tümünü-yakala oluştur'; +$PALANG['pViewlog_action_edit_fetchmail'] = 'tümünü-yakala iş düzenle'; +$PALANG['pViewlog_action_delete_fetchmail'] = 'tümünü-yakala sil'; $PALANG['pViewlog_result_error'] = 'Loglar bulunamıyor!'; @@ -250,44 +250,44 @@ $PALANG['pAdminList_admin_count'] = 'Domainler'; $PALANG['description'] = 'Açıklama'; $PALANG['aliases'] = 'Aliaslar'; # XXX check text - should be 'Aliases' -$PALANG['pAdminList_domain_quota'] = 'Domain kotası (MB)'; # XXX +$PALANG['pAdminList_domain_quota'] = 'Domain kotası (MB)'; $PALANG['pAdminList_domain_backupmx'] = 'Yedek Backup MX'; $PALANG['last_modified'] = 'Son Düzenleme'; $PALANG['pAdminCreate_domain_welcome'] = 'Yeni domain ekle'; $PALANG['pAdminCreate_domain_domain_text_error'] = 'Bu domain halen mevcut!'; -$PALANG['domain_does_not_exist'] = 'Bu domain mevcut değil!'; # XXX -$PALANG['pAdminCreate_domain_domain_text_error2'] = 'Domain geçersiz!'; # XXX +$PALANG['domain_does_not_exist'] = 'Bu domain mevcut değil!'; +$PALANG['pAdminCreate_domain_domain_text_error2'] = 'Domain geçersiz!'; $PALANG['pAdminCreate_domain_defaultaliases'] = 'Öntanımlı e-posta aliası ekle'; $PALANG['pAdminCreate_domain_button'] = 'Domain ekle'; $PALANG['pAdminCreate_domain_result_error'] = 'Domain eklenemedi! (%s)'; # XXX Text changed to: Adding the domain %s failed! $PALANG['pAdminCreate_domain_result_success'] = 'Domain eklendi! (%s)'; # XXX Text changed to: The domain %s has been added. -$PALANG['domain_updated'] = 'Domain güncelleştirildi: %s'; # XXX -$PALANG['pAdminDelete_admin_error'] = 'Yönetici silinemedi!'; # XXX -$PALANG['domain_postdel_failed'] = 'Bu domaine ait silme-sonrası skript çalıştırılamadı, lütfen detaylar için kayıtları, logları inceleyin!'; # XXX -$PALANG['domain_postcreate_failed'] = 'Bu domaine ait oluşturma-sonrası skript çalıştırılamadı, lütfen detaylar için kayıtları, logları inceleyin!'; # XXX -$PALANG['mailbox_postdel_failed'] = 'E-posta hesabı silme-sonrası skript çalıştırılamadı, lütfen detaylar için kayıtları, logları inceleyin!'; # XXX -$PALANG['mailbox_postedit_failed'] = 'E-posta düzenleme-sonrası skript çalıştırılamadı, lütfen detaylar için kayıtları, logları inceleyin!'; # XXX -$PALANG['mailbox_postcreate_failed'] = 'E-posta oluşturma-sonrası skript çalıştırılamadı, lütfen detaylar için kayıtları, logları inceleyin!'; # XXX -$PALANG['pAdminDelete_alias_domain_error'] = 'Domain aliasları silinemedi!'; # XXX -$PALANG['domain_conflict_vacation_domain'] = 'Tatil domain adresini e-posta domaini olarak kullanamazsınız!'; # XXX +$PALANG['domain_updated'] = 'Domain güncelleştirildi: %s'; +$PALANG['pAdminDelete_admin_error'] = 'Yönetici silinemedi!'; +$PALANG['domain_postdel_failed'] = 'Bu domaine ait silme-sonrası skript çalıştırılamadı, lütfen detaylar için kayıtları, logları inceleyin!'; +$PALANG['domain_postcreate_failed'] = 'Bu domaine ait oluşturma-sonrası skript çalıştırılamadı, lütfen detaylar için kayıtları, logları inceleyin!'; +$PALANG['mailbox_postdel_failed'] = 'E-posta hesabı silme-sonrası skript çalıştırılamadı, lütfen detaylar için kayıtları, logları inceleyin!'; +$PALANG['mailbox_postedit_failed'] = 'E-posta düzenleme-sonrası skript çalıştırılamadı, lütfen detaylar için kayıtları, logları inceleyin!'; +$PALANG['mailbox_postcreate_failed'] = 'E-posta oluşturma-sonrası skript çalıştırılamadı, lütfen detaylar için kayıtları, logları inceleyin!'; +$PALANG['pAdminDelete_alias_domain_error'] = 'Domain aliasları silinemedi!'; +$PALANG['domain_conflict_vacation_domain'] = 'Tatil domain adresini e-posta domaini olarak kullanamazsınız!'; $PALANG['pAdminEdit_domain_welcome'] = 'Domain düzenle'; $PALANG['pAdminEdit_domain_aliases_text'] = '-1 = iptal | 0 = limitsiz'; # XXX check - "limisiz" or "limi_t_siz"? $PALANG['pAdminEdit_domain_maxquota'] = 'Maks Kota'; $PALANG['pAdminEdit_domain_maxquota_text'] = 'MB | -1 = iptal | 0 = limitsiz'; -$PALANG['pAdminEdit_domain_quota'] = 'Domain Kota'; # XXX +$PALANG['pAdminEdit_domain_quota'] = 'Domain Kota'; $PALANG['transport'] = 'Transport'; # XXX -$PALANG['pAdminEdit_domain_transport_text'] = 'Transport tanımlama'; # XXX -$PALANG['pAdminEdit_domain_backupmx'] = 'Mail sunucusu bir yedek backup MX kaydıdır'; # XXX +$PALANG['pAdminEdit_domain_transport_text'] = 'Transport tanımlama'; +$PALANG['pAdminEdit_domain_backupmx'] = 'Mail sunucusu bir yedek backup MX kaydıdır'; $PALANG['pAdminEdit_domain_result_error'] = 'Domain düzenlenemedi! (%s)'; # XXX Text changed to: Modifying the domain %s failed! $PALANG['pAdminCreate_admin_welcome'] = 'Yöneticiye yeni bir domain ekle'; $PALANG['email_address'] = 'E-posta adresi'; $PALANG['pAdminCreate_admin_username_text_error1'] = 'Yönetici uygun bir e-posta adresi değil!'; $PALANG['admin_already_exists'] = 'Yönetici zaten mevcut veya uygun değil'; # XXX Text changed to: The admin already exists! -$PALANG['admin_does_not_exist'] = 'Yönetici mevcut değil!'; # XXX +$PALANG['admin_does_not_exist'] = 'Yönetici mevcut değil!'; $PALANG['pAdminCreate_admin_button'] = 'Yönetici ekle'; $PALANG['pAdminCreate_admin_result_error'] = 'Yönetici eklenemiyor! (%s)'; # XXX Text changed to: Adding the admin %s failed! $PALANG['pAdminCreate_admin_result_success'] = 'Yönetici eklendi! (%s)'; # XXX Text changed to: The admin %s has been added. @@ -295,21 +295,21 @@ $PALANG['pAdminCreate_admin_result_success'] = 'Yönetici eklendi! (%s)'; # XXX $PALANG['pAdminEdit_admin_welcome'] = 'Domain yöneticisi düzenle'; $PALANG['admin'] = 'Yönetici'; $PALANG['password_again'] = 'Şifre (tekrar)'; -$PALANG['super_admin'] = 'Süper admin'; # XXX -$PALANG['super_admin_desc'] = 'Süper admin yöneticiler, tüm domainler üzerinde yetkilidirler, tüm domainleri ve yönetici admin hesaplarını düzenleyebilirler.'; # XXX +$PALANG['super_admin'] = 'Süper admin'; +$PALANG['super_admin_desc'] = 'Süper admin yöneticiler, tüm domainler üzerinde yetkilidirler, tüm domainleri ve yönetici admin hesaplarını düzenleyebilirler.'; $PALANG['pAdminEdit_admin_result_error'] = 'Yönetici düzenlenemedi! (%s)'; # XXX Text changed to: Modifying the admin %s failed! $PALANG['pAdminEdit_admin_result_success'] = 'Yönetici düzenlendi! (%s)'; # XXX Text changed to: The admin %s has been modified. $PALANG['pUsersLogin_welcome'] = 'E-posta kutusu sahipleri, şifre değiştirmek için giriş yapın.'; $PALANG['pUsersLogin_username_incorrect'] = 'Kullanıcı adınız doğru değil. E-posta adresiniz ile giriş yaptığınızdan emin olunuz!'; $PALANG['pUsersLogin_password_incorrect'] = 'Şifreniz doğru değil!'; -$PALANG['pUsersLogin_password_recover'] = 'Şifremi unuttum'; # XXX +$PALANG['pUsersLogin_password_recover'] = 'Şifremi unuttum'; $PALANG['pUsersMenu_vacation'] = 'Otomatik cevaplama'; $PALANG['pUsersMenu_edit_alias'] = 'Yönlendirme değiştir'; $PALANG['pUsersMain_vacation'] = 'Posta kutunuz için "ofis dışı" mesajı veya otomatik cevaplama ekleyin.'; -$PALANG['pUsersMain_vacationSet'] = 'Otomatik cevaplama AKTİF durumda. \'Otomatik Cevaplama\' linkine tıklayarak düzenleyin veya kaldırın.'; # XXX +$PALANG['pUsersMain_vacationSet'] = 'Otomatik cevaplama AKTİF durumda. \'Otomatik Cevaplama\' linkine tıklayarak düzenleyin veya kaldırın.'; $PALANG['pUsersMain_edit_alias'] = 'E-posta yönlendirmenizi değiştirin.'; $PALANG['pUsersMain_password'] = 'Şifrenizi değiştirin.'; @@ -321,86 +321,86 @@ $PALANG['pUsersVacation_body_text'] = << ile tarihleri arası burada bulunmayacağım. Acil durumlarda lütfen adresli yetkiliye başvurunuz. EOM; -$PALANG['pUsersVacation_activefrom'] = 'Aktif olma tarih başlangıç'; # XXX -$PALANG['pUsersVacation_activeuntil'] = 'Aktif olma tarih bitiş'; # XXX +$PALANG['pUsersVacation_activefrom'] = 'Aktif olma tarih başlangıç'; +$PALANG['pUsersVacation_activeuntil'] = 'Aktif olma tarih bitiş'; -$PALANG['pEdit_dbLog_editactive'] = 'Aktiflik durumunu değiştir'; # XXX +$PALANG['pEdit_dbLog_editactive'] = 'Aktiflik durumunu değiştir'; -$PALANG['pSearch'] = 'ara'; # XXX -$PALANG['pSearch_welcome'] = 'Aranan: '; # XXX -$PALANG['pReturn_to'] = 'Geri dön'; # XXX -$PALANG['pBroadcast_title'] = 'Toplu sistem mesajı gönder'; # XXX -$PALANG['pBroadcast_name'] = 'İsminiz'; # XXX -$PALANG['pBroadcast_success'] = 'Toplu sistem mesajınız gönderildi.'; # XXX -$PALANG['pAdminMenu_broadcast_message'] = 'Sistem mesajı'; # XXX -$PALANG['pBroadcast_error_empty'] = 'İsim, Konu ve Mesaj gibi alanlar boş bırakılmamalı!'; # XXX -$PALANG['broadcast_mailboxes_only'] = 'Sadece belirtilen e-posta hesaplarına gönder'; # XXX -$PALANG['broadcast_to_domains'] = 'Domainlere gönder:'; # XXX -$PALANG['pStatus_undeliverable'] = 'GÖNDERİLEMEMİŞ veya gönderilemeyen olabilir '; # XXX -$PALANG['pStatus_disabled'] = 'Hesap pasif '; # XXX -$PALANG['pStatus_expired'] = 'Şifrenin süresi doldu '; # XXX -$PALANG['pStatus_vacation'] = 'Tatil modu aktif '; # XXX -$PALANG['pStatus_custom'] = 'İletilen '; # XXX +$PALANG['pSearch'] = 'ara'; +$PALANG['pSearch_welcome'] = 'Aranan: '; +$PALANG['pReturn_to'] = 'Geri dön'; +$PALANG['pBroadcast_title'] = 'Toplu sistem mesajı gönder'; +$PALANG['pBroadcast_name'] = 'İsminiz'; +$PALANG['pBroadcast_success'] = 'Toplu sistem mesajınız gönderildi.'; +$PALANG['pAdminMenu_broadcast_message'] = 'Sistem mesajı'; +$PALANG['pBroadcast_error_empty'] = 'İsim, Konu ve Mesaj gibi alanlar boş bırakılmamalı!'; +$PALANG['broadcast_mailboxes_only'] = 'Sadece belirtilen e-posta hesaplarına gönder'; +$PALANG['broadcast_to_domains'] = 'Domainlere gönder:'; +$PALANG['pStatus_undeliverable'] = 'GÖNDERİLEMEMİŞ veya gönderilemeyen olabilir '; +$PALANG['pStatus_disabled'] = 'Hesap pasif '; +$PALANG['pStatus_expired'] = 'Şifrenin süresi doldu '; +$PALANG['pStatus_vacation'] = 'Tatil modu aktif '; +$PALANG['pStatus_custom'] = 'İletilen '; $PALANG['pStatus_popimap'] = 'POP/IMAP '; # XXX -$PALANG['password_too_short'] = "Şifre çok kısa - en az %s karakter gerekli"; # XXX -$PALANG['password_no_characters'] = "Şifreniz en az %s karakter içermeli (A-Z, a-z)."; # XXX -$PALANG['password_no_digits'] = "Şifreniz en az %s rakam içermeli."; # XXX -$PALANG['pInvalidDomainRegex'] = "Geçersiz domain ismi: %s, kontrol edilemedi"; # XXX -$PALANG['pInvalidDomainDNS'] = "Geçersiz domain: %s, ve/veya DNS tarafından çözümlenemedi"; # XXX -$PALANG['pInvalidMailRegex'] = "Geçersiz e-posta adresi: %s, kontrol edilemedi"; # XXX -$PALANG['pFetchmail_welcome'] = 'Adrese gelen mailleri yakala:'; # XXX -$PALANG['pFetchmail_new_entry'] = 'Yeni girdi'; # XXX -$PALANG['fetchmail_already_exists'] = 'Bu e-posta yakalama işi zaten mevcut!'; # XXX -$PALANG['fetchmail_does_not_exist'] = 'Bu e-posta yakalama işi mevcut değil!'; # XXX -$PALANG['pFetchmail_database_save_error'] = 'Bu girdi, veritabanına kaydedilemedi!'; # XXX -$PALANG['pFetchmail_database_save_success'] = 'Girdiler veritabanına kaydedildi.'; # XXX -$PALANG['pFetchmail_error_invalid_id'] = '%s isimli herhangi bir girdi bulunamadı!'; # XXX -$PALANG['pFetchmail_invalid_mailbox'] = 'Geçersiz e-posta!'; # XXX -$PALANG['pFetchmail_server_missing'] = 'Lütfen uzaktaki sunucunun adını giriniz!'; # XXX -$PALANG['pFetchmail_user_missing'] = 'Lütfen uzaktaki sunucunun kullanıcı adını giriniz!'; # XXX -$PALANG['pFetchmail_password_missing'] = 'Lütfen uzaktaki sunucunun şifresini giriniz!'; # XXX +$PALANG['password_too_short'] = "Şifre çok kısa - en az %s karakter gerekli"; +$PALANG['password_no_characters'] = "Şifreniz en az %s karakter içermeli (A-Z, a-z)."; +$PALANG['password_no_digits'] = "Şifreniz en az %s rakam içermeli."; +$PALANG['pInvalidDomainRegex'] = "Geçersiz domain ismi: %s, kontrol edilemedi"; +$PALANG['pInvalidDomainDNS'] = "Geçersiz domain: %s, ve/veya DNS tarafından çözümlenemedi"; +$PALANG['pInvalidMailRegex'] = "Geçersiz e-posta adresi: %s, kontrol edilemedi"; +$PALANG['pFetchmail_welcome'] = 'Adrese gelen mailleri yakala:'; +$PALANG['pFetchmail_new_entry'] = 'Yeni girdi'; +$PALANG['fetchmail_already_exists'] = 'Bu e-posta yakalama işi zaten mevcut!'; +$PALANG['fetchmail_does_not_exist'] = 'Bu e-posta yakalama işi mevcut değil!'; +$PALANG['pFetchmail_database_save_error'] = 'Bu girdi, veritabanına kaydedilemedi!'; +$PALANG['pFetchmail_database_save_success'] = 'Girdiler veritabanına kaydedildi.'; +$PALANG['pFetchmail_error_invalid_id'] = '%s isimli herhangi bir girdi bulunamadı!'; +$PALANG['pFetchmail_invalid_mailbox'] = 'Geçersiz e-posta!'; +$PALANG['pFetchmail_server_missing'] = 'Lütfen uzaktaki sunucunun adını giriniz!'; +$PALANG['pFetchmail_user_missing'] = 'Lütfen uzaktaki sunucunun kullanıcı adını giriniz!'; +$PALANG['pFetchmail_password_missing'] = 'Lütfen uzaktaki sunucunun şifresini giriniz!'; $PALANG['pFetchmail_field_id'] = 'ID'; # XXX -$PALANG['pFetchmail_field_mailbox'] = 'E-posta Kutusu'; # XXX -$PALANG['pFetchmail_field_src_server'] = 'Sunucu'; # XXX +$PALANG['pFetchmail_field_mailbox'] = 'E-posta Kutusu'; +$PALANG['pFetchmail_field_src_server'] = 'Sunucu'; $PALANG['pFetchmail_field_src_port'] = 'Port'; # XXX -$PALANG['pFetchmail_field_src_auth'] = 'Auth Giriş Biçimi'; # XXX -$PALANG['pFetchmail_field_src_user'] = 'Kullanıcı'; # XXX +$PALANG['pFetchmail_field_src_auth'] = 'Auth Giriş Biçimi'; +$PALANG['pFetchmail_field_src_user'] = 'Kullanıcı'; $PALANG['pFetchmail_field_src_password'] = $PALANG['password']; # needed until fetchmail is migrated into FetchmailHandler -$PALANG['pFetchmail_field_src_folder'] = 'Klasör'; # XXX +$PALANG['pFetchmail_field_src_folder'] = 'Klasör'; $PALANG['pFetchmail_field_poll_time'] = 'Poll'; # XXX -$PALANG['pFetchmail_field_fetchall'] = 'Yakala '; # XXX -$PALANG['pFetchmail_field_keep'] = 'Tut'; # XXX -$PALANG['pFetchmail_field_protocol'] = 'Protokol'; # XXX -$PALANG['pFetchmail_field_usessl'] = 'SSL etkin'; # XXX -$PALANG['pFetchmail_field_sslcertck'] = 'SSL sertifika kontrol'; # XXX -$PALANG['pFetchmail_field_sslcertpath'] = 'SSL sertifikası yolu'; # XXX +$PALANG['pFetchmail_field_fetchall'] = 'Yakala '; +$PALANG['pFetchmail_field_keep'] = 'Tut'; +$PALANG['pFetchmail_field_protocol'] = 'Protokol'; +$PALANG['pFetchmail_field_usessl'] = 'SSL etkin'; +$PALANG['pFetchmail_field_sslcertck'] = 'SSL sertifika kontrol'; +$PALANG['pFetchmail_field_sslcertpath'] = 'SSL sertifikası yolu'; $PALANG['pFetchmail_field_sslfingerprint'] = 'SSL fingerprint (md5)'; # XXX -$PALANG['pFetchmail_field_extra_options'] = 'Ekstra Seçenekler'; # XXX -$PALANG['pFetchmail_field_mda'] = 'PDA'; # XXX -$PALANG['pFetchmail_field_date'] = 'Tarih'; # XXX -$PALANG['pFetchmail_field_returned_text'] = 'Geri Dönen Metin'; # XXX -$PALANG['pFetchmail_desc_id'] = 'Kayıt ID'; # XXX -$PALANG['pFetchmail_desc_mailbox'] = 'Yerel e-posta kutusu'; # XXX -$PALANG['pFetchmail_desc_src_server'] = 'Uzak Sunucu'; # XXX -$PALANG['pFetchmail_desc_src_port'] = 'Uzak port numarası - şayet standart olmayan bir port kullanılıyorsa. (0: varsayılan standardı kullan)'; # XXX -$PALANG['pFetchmail_desc_src_auth'] = 'Çoğunlukla \'password\''; # Translators: Please do NOT translate 'password' here # XXX -$PALANG['pFetchmail_desc_src_user'] = 'Uzak Kullanıcı'; # XXX -$PALANG['pFetchmail_desc_src_password'] = 'Uzak Şifre'; # XXX -$PALANG['pFetchmail_desc_src_folder'] = 'Uzak Klasör'; # XXX -$PALANG['pFetchmail_desc_poll_time'] = 'Her .... dakikada bi poll'; # XXX -$PALANG['pFetchmail_desc_fetchall'] = 'Hem eski (okunan) hem de yeni iletileri çek'; # XXX -$PALANG['pFetchmail_desc_keep'] = 'Eski iletileri uzaktaki mail sunucusunda saklı tut'; # XXX -$PALANG['pFetchmail_desc_protocol'] = 'Kullanılacak protokol'; # XXX -$PALANG['pFetchmail_desc_usessl'] = 'SSL şifreleme'; # XXX -$PALANG['pFetchmail_desc_extra_options'] = 'Ekstra ileti-yakalama Seçenekleri'; # XXX -$PALANG['pFetchmail_desc_mda'] = 'Posta Dağıtım Aracısı'; # XXX -$PALANG['pFetchmail_desc_date'] = 'Son poll/konfigürasyon değişikliği tarihi'; # XXX -$PALANG['pFetchmail_desc_returned_text'] = 'Son poll işleminden gelen metin iletisi'; # XXX -$PALANG['dateformat_pgsql'] = 'dd-mm-YYYY'; # translators: rearrange to your local date format, but make sure it's a valid PostgreSQL date format # XXX -$PALANG['dateformat_mysql'] = '%d-%m-%Y'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format # XXX -$PALANG['password_expiration'] = 'Şifrenin geçerlilik süresi dolma'; # XXX -$PALANG['password_expiration_desc'] = 'Şifrenin geçerlilik süresinin doluş tarihi'; # XXX +$PALANG['pFetchmail_field_extra_options'] = 'Ekstra Seçenekler'; +$PALANG['pFetchmail_field_mda'] = 'PDA'; +$PALANG['pFetchmail_field_date'] = 'Tarih'; +$PALANG['pFetchmail_field_returned_text'] = 'Geri Dönen Metin'; +$PALANG['pFetchmail_desc_id'] = 'Kayıt ID'; +$PALANG['pFetchmail_desc_mailbox'] = 'Yerel e-posta kutusu'; +$PALANG['pFetchmail_desc_src_server'] = 'Uzak Sunucu'; +$PALANG['pFetchmail_desc_src_port'] = 'Uzak port numarası - şayet standart olmayan bir port kullanılıyorsa. (0: varsayılan standardı kullan)'; +$PALANG['pFetchmail_desc_src_auth'] = 'Çoğunlukla \'password\''; # Translators: Please do NOT translate 'password' here +$PALANG['pFetchmail_desc_src_user'] = 'Uzak Kullanıcı'; +$PALANG['pFetchmail_desc_src_password'] = 'Uzak Şifre'; +$PALANG['pFetchmail_desc_src_folder'] = 'Uzak Klasör'; +$PALANG['pFetchmail_desc_poll_time'] = 'Her .... dakikada bi poll'; +$PALANG['pFetchmail_desc_fetchall'] = 'Hem eski (okunan) hem de yeni iletileri çek'; +$PALANG['pFetchmail_desc_keep'] = 'Eski iletileri uzaktaki mail sunucusunda saklı tut'; +$PALANG['pFetchmail_desc_protocol'] = 'Kullanılacak protokol'; +$PALANG['pFetchmail_desc_usessl'] = 'SSL şifreleme'; +$PALANG['pFetchmail_desc_extra_options'] = 'Ekstra ileti-yakalama Seçenekleri'; +$PALANG['pFetchmail_desc_mda'] = 'Posta Dağıtım Aracısı'; +$PALANG['pFetchmail_desc_date'] = 'Son poll/konfigürasyon değişikliği tarihi'; +$PALANG['pFetchmail_desc_returned_text'] = 'Son poll işleminden gelen metin iletisi'; +$PALANG['dateformat_pgsql'] = 'dd-mm-YYYY'; # translators: rearrange to your local date format, but make sure it's a valid PostgreSQL date format +$PALANG['dateformat_mysql'] = '%d-%m-%Y'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format +$PALANG['password_expiration'] = 'Şifrenin geçerlilik süresi dolma'; +$PALANG['password_expiration_desc'] = 'Şifrenin geçerlilik süresinin doluş tarihi'; $PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh /* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */ From 531a52e05323055a36474639b0a53e87bba52f74 Mon Sep 17 00:00:00 2001 From: Christian Boltz Date: Wed, 1 Apr 2020 20:52:20 +0200 Subject: [PATCH 016/691] remove superfluous code in check_language() dd52a98d4392b443f0e14cf41ebe5030315497c7 added honoring POST['lang'] and COOKIE['lang'] even if $_SERVER['HTTP_ACCEPT_LANGUAGE'] is not set. This also means we can drop the now-duplicate check in the code section handling $_SERVER['HTTP_ACCEPT_LANGUAGE']. --- functions.inc.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/functions.inc.php b/functions.inc.php index 5d2d2398..48df3c64 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -182,12 +182,6 @@ function check_language($use_post = true) { // If not, did the browser give us any hint(s)? if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $lang_array = preg_split('/(\s*,\s*)/', $_SERVER['HTTP_ACCEPT_LANGUAGE']); - if (safecookie('lang')) { - array_unshift($lang_array, safecookie('lang')); # prefer language from cookie - } - if ($use_post && safepost('lang')) { - array_unshift($lang_array, safepost('lang')); # but prefer $_POST['lang'] even more - } foreach ($lang_array as $value) { if (!is_string($value)) { From dec4b38f3513d87caf9a98c974bd26f481a63f02 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Wed, 1 Apr 2020 21:29:40 +0100 Subject: [PATCH 017/691] improve langauge checks (remove unnecessary is_string check) --- functions.inc.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/functions.inc.php b/functions.inc.php index 48df3c64..6e74f9c3 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -180,13 +180,9 @@ function check_language($use_post = true) { $lang = Config::read_string('default_language'); // If not, did the browser give us any hint(s)? - if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { + if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $lang_array = preg_split('/(\s*,\s*)/', $_SERVER['HTTP_ACCEPT_LANGUAGE']); - foreach ($lang_array as $value) { - if (!is_string($value)) { - continue; - } $lang_next = strtolower(trim($value)); $lang_next = preg_replace('/;.*$/', '', $lang_next); # remove things like ";q=0.8" if (array_key_exists($lang_next, $supported_languages)) { From 3b704715dcaf7333e600fcbfd635ca95bfe9e62b Mon Sep 17 00:00:00 2001 From: Christian Boltz Date: Fri, 10 Apr 2020 21:01:34 +0200 Subject: [PATCH 018/691] setup.php: replace last mentions of php5 with php7 --- public/setup.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/setup.php b/public/setup.php index 80de9772..796769be 100644 --- a/public/setup.php +++ b/public/setup.php @@ -117,10 +117,10 @@ require(dirname(__FILE__) . '/../templates/header.php'); print "% portinstall php{$phpversion}-mysql\n"; if ($phpversion >= 5) { print "To install MySQL 4.1 support on FreeBSD:
\n"; - print "
% cd /usr/ports/databases/php5-mysqli/\n";
+                    print "
% cd /usr/ports/databases/php7-mysqli/\n";
                     print "% make clean install\n";
                     print " - or with portupgrade -\n";
-                    print "% portinstall php5-mysqli
\n"; + print "% portinstall php7-mysqli
\n"; } print "To install PostgreSQL support on FreeBSD:
\n"; print "
% cd /usr/ports/databases/php{$phpversion}-pgsql/\n";

From eea72e0019ed7fa82d3595ceb336403b781d3647 Mon Sep 17 00:00:00 2001
From: David Goodwin 
Date: Fri, 10 Apr 2020 22:30:48 +0100
Subject: [PATCH 019/691] check for PDO modules in setup.php, not old style
 functions

---
 public/setup.php | 73 ++++++++++++++++--------------------------------
 1 file changed, 24 insertions(+), 49 deletions(-)

diff --git a/public/setup.php b/public/setup.php
index 80de9772..a47a6be8 100644
--- a/public/setup.php
+++ b/public/setup.php
@@ -37,11 +37,12 @@ require(dirname(__FILE__) . '/../templates/header.php');
             //
             $f_phpversion = function_exists("phpversion");
             $f_apache_get_version = function_exists("apache_get_version");
-            $f_mysql_connect = function_exists("mysql_connect");
-            $f_mysqli_connect = function_exists("mysqli_connect");
-            $f_pg_connect = function_exists("pg_connect");
-            $f_sqlite_open = class_exists("SQLite3");
-            $f_pdo = class_exists('PDO');
+
+            $m_pdo       = extension_loaded("PDO");
+            $m_pdo_mysql = extension_loaded("pdo_mysql");
+            $m_pdo_pgsql = extension_loaded('pdo_pgsql');
+            $m_pdo_sqlite= extension_loaded("pdo_sqlite");
+
             $f_session_start = function_exists("session_start");
             $f_preg_match = function_exists("preg_match");
             $f_mb_encode_mimeheader = function_exists("mb_encode_mimeheader");
@@ -105,68 +106,42 @@ require(dirname(__FILE__) . '/../templates/header.php');
                 print "Create the file, and edit as appropriate (e.g. select database type etc)
"; } - // // Check if there is support for at least 1 database - // - if (($f_pdo == 0) and ($f_mysql_connect == 0) and ($f_mysqli_connect == 0) and ($f_pg_connect == 0) and ($f_sqlite_open == 0)) { - print "
  • Error: There is no database support in your PHP setup
    \n"; - print "To install MySQL 3.23 or 4.0 support on FreeBSD:
    \n"; - print "
    % cd /usr/ports/databases/php{$phpversion}-mysql/\n";
    -                print "% make clean install\n";
    -                print " - or with portupgrade -\n";
    -                print "% portinstall php{$phpversion}-mysql
    \n"; - if ($phpversion >= 5) { - print "To install MySQL 4.1 support on FreeBSD:
    \n"; - print "
    % cd /usr/ports/databases/php5-mysqli/\n";
    -                    print "% make clean install\n";
    -                    print " - or with portupgrade -\n";
    -                    print "% portinstall php5-mysqli
    \n"; - } - print "To install PostgreSQL support on FreeBSD:
    \n"; - print "
    % cd /usr/ports/databases/php{$phpversion}-pgsql/\n";
    -                print "% make clean install\n";
    -                print " - or with portupgrade -\n";
    -                print "% portinstall php{$phpversion}-pgsql
  • \n"; + if (($m_pdo == 0) and ($m_pdo_mysql == 0) and ($m_pdo_sqlite == 0) and ($m_pdo_psql == 0) ) { + print "
  • Error: There is no database (PDO) support in your PHP setup
    \n"; + print " + You MUST install a suitable PHP PDO extension (e.g. pdo_pgsql, pdo_mysql or pdo_sqlite). + \n
  • "; $error += 1; } - if ($f_mysqli_connect == 1) { - print "
  • Database - MySQL (mysqli_ functions) - Found\n"; - if (Config::read_string('database_type') != 'mysqli') { - print "
    (change the database_type to 'mysqli' in config.local.php if you want to use MySQL)\n"; - } - print "
  • "; + if ($m_pdo_mysql == 1) { + print "
  • Database - PDO MySQL - Found
  • "; } else { - print "
  • Database - MySQL (mysqli_ functions) - Not found
  • "; - } - - - if (Config::read_string('database_type') == 'mysql') { - print "
  • Warning: your configured database_type 'mysql' is deprecated; you must move to use 'mysqli' in your config.local.php.
  • \n"; - $error++; + print "
  • Database - MySQL (pdo_mysql) extension not found
  • "; } // // PostgreSQL functions // - if ($f_pg_connect == 1) { - print "
  • Database : PostgreSQL support (pg_ functions) - Found\n"; + if ($m_pdo_pgsql == 1) { + print "
  • Database : PDO PostgreSQL - Found \n"; if (Config::read_string('database_type') != 'pgsql') { print "
    (change the database_type to 'pgsql' in config.local.php if you want to use PostgreSQL)\n"; } print "
  • "; } else { - print "
  • Database - PostgreSQL (pg_ functions) - Not found
  • "; + print "
  • Database - PostgreSQL (pdo_pgsql) extension not found
  • "; } - if ($f_sqlite_open == 1) { - print "
  • Database : SQLite support (SQLite3) - Found \n"; + if ($m_pdo_sqlite == 1) { + print "
  • Database : PDO SQLite - Found \n"; if (Config::read_string('database_type') != 'sqlite') { print "
    (change the database_type to 'sqlite' in config.local.php if you want to use SQLite)\n"; } print "
  • "; } else { - print "
  • Database - SQLite (SQLite3) - Not found
  • "; + print "
  • Database - SQLite (pdo_sqlite) extension not found
  • "; } // @@ -226,8 +201,8 @@ require(dirname(__FILE__) . '/../templates/header.php'); if ($f_mb_encode_mimeheader == 1) { print "
  • Depends on: multibyte string - Found
  • \n"; } else { - print "
  • Error: Depends on: multibyte string - NOT FOUND
    \n"; - print "To install multibyte string support, install php$phpversion-mbstring
  • \n"; + print "
  • Error: Depends on: multibyte string - mbstring extension missing.
    \n"; + print "To install multibyte string support, perhaps install php$phpversion-mbstring
  • \n"; $error += 1; } @@ -238,8 +213,8 @@ require(dirname(__FILE__) . '/../templates/header.php'); if ($f_imap_open == 1) { print "
  • IMAP functions - Found
  • \n"; } else { - print "
  • Warning: May depend on: IMAP functions - Not Found
    \n"; - print "To install IMAP support, install php$phpversion-imap
    \n"; + print "
  • Warning: Optional dependency 'imap' extension missing
    \n"; + print "To install IMAP support, perhaps install php$phpversion-imap
    \n"; print "Without IMAP support, you won't be able to create subfolders when creating mailboxes.
  • \n"; } From 5e8ce2b5b0527a9d977ef7a362ae6f02da878ac9 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 11 Apr 2020 19:10:09 +0100 Subject: [PATCH 020/691] move to php-parallel-lint/php-parallel-lint rather than abandoned jakuk-onderka/php-parallel-lint --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 7ed17b9a..78a571a7 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "ext-mysqli": "*", "ext-sqlite3": "*", "friendsofphp/php-cs-fixer": "*", - "jakub-onderka/php-parallel-lint": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.0", "php": ">7.2.0", "php-coveralls/php-coveralls" : "*", "phpunit/phpunit": "^6|^7", From 3cd62f9f4fbd59b8a2d9bb3c19fb4604003b8f8b Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Tue, 14 Apr 2020 21:03:10 +0100 Subject: [PATCH 021/691] update to phpunit v8, try changing coveralls library, update github action --- .github/workflows/php.yml | 5 ++--- composer.json | 6 +++--- public/upgrade.php | 2 +- tests/AliasHandlerTest.php | 2 +- tests/CreatePageBrowserTest.php | 2 +- tests/DbBasicTest.php | 2 +- tests/MailboxHandlerTest.php | 2 +- tests/RemoteAliasTest.php | 11 ----------- tests/RemoteTest.php | 2 +- tests/RemoteVacationTest.php | 4 ++-- tests/bootstrap.php | 6 +++--- 11 files changed, 16 insertions(+), 28 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 50a1309f..bc6261f3 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -29,7 +29,6 @@ jobs: run: mkdir -p build/logs || true - name: Coveralls - run: php vendor/bin/php-coveralls -v --coverage_clover=coverage.xml || true + run: vendor/bin/coveralls ./clover.xml env: - COVERALLS_RUN_LOCALLY: 1 - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} diff --git a/composer.json b/composer.json index 78a571a7..e08eae1c 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ "check-format": "php-cs-fixer fix --ansi --dry-run --diff", "format": "php-cs-fixer fix --ansi", "lint": "@php ./vendor/bin/parallel-lint --exclude vendor/ --exclude lib/block_random_int.php --exclude lib/array_column.php .", - "test": "DATABASE=sqlite ./vendor/bin/phpunit --coverage-clover ./coverage.xml tests/", + "test": "DATABASE=sqlite ./vendor/bin/phpunit --coverage-clover ./clover.xml tests/", "test-fixup": "mkdir -p templates_c ; test -f config.local.php || touch config.local.php", "psalm": "@php ./vendor/bin/psalm --no-cache --show-info=false " }, @@ -27,8 +27,8 @@ "friendsofphp/php-cs-fixer": "*", "php-parallel-lint/php-parallel-lint": "^1.0", "php": ">7.2.0", - "php-coveralls/php-coveralls" : "*", - "phpunit/phpunit": "^6|^7", + "cedx/coveralls": "^11.0", + "phpunit/phpunit": "8.*", "vimeo/psalm":"^3.0", "shardj/zf1-future" : "^1.12" }, diff --git a/public/upgrade.php b/public/upgrade.php index 8ca53aaa..0f564772 100644 --- a/public/upgrade.php +++ b/public/upgrade.php @@ -103,7 +103,7 @@ function _db_add_field($table, $field, $fieldtype, $after = '') { function echo_out($text) { if (defined('PHPUNIT_TEST')) { - error_log("" . $text); + //error_log("" . $text); } else { echo $text . "\n"; } diff --git a/tests/AliasHandlerTest.php b/tests/AliasHandlerTest.php index 76d3df8a..b6e685c6 100644 --- a/tests/AliasHandlerTest.php +++ b/tests/AliasHandlerTest.php @@ -9,7 +9,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertEmpty($results); } - public function tearDown() { + public function tearDown() : void { $_SESSION = []; db_query('DELETE FROM alias'); db_query('DELETE FROM domain'); diff --git a/tests/CreatePageBrowserTest.php b/tests/CreatePageBrowserTest.php index 51abe158..2e2beeaf 100644 --- a/tests/CreatePageBrowserTest.php +++ b/tests/CreatePageBrowserTest.php @@ -1,7 +1,7 @@ cleanup(); } diff --git a/tests/DbBasicTest.php b/tests/DbBasicTest.php index dd6750bd..c18fb68e 100644 --- a/tests/DbBasicTest.php +++ b/tests/DbBasicTest.php @@ -3,7 +3,7 @@ class DbBasicTest extends \PHPUnit\Framework\TestCase { private $test_domain; - public function setUp() { + public function setUp() : void { $db = db_connect(); $test_domain = 'test' . uniqid() . '.com'; $this->test_domain = $test_domain; diff --git a/tests/MailboxHandlerTest.php b/tests/MailboxHandlerTest.php index 8f6a6899..7905d88f 100644 --- a/tests/MailboxHandlerTest.php +++ b/tests/MailboxHandlerTest.php @@ -1,7 +1,7 @@ assertEquals($this->alias->get(), array()); diff --git a/tests/RemoteTest.php b/tests/RemoteTest.php index 5f2ba1bf..b95e077b 100644 --- a/tests/RemoteTest.php +++ b/tests/RemoteTest.php @@ -12,7 +12,7 @@ abstract class RemoteTest extends \PHPUnit\Framework\TestCase { protected $xmlrpc_client; - public function setUp() { + public function setUp() : void { parent::setUp(); if ($this->server_url == 'http://change.me/to/work') { diff --git a/tests/RemoteVacationTest.php b/tests/RemoteVacationTest.php index 0fccb9ad..3a5f43c3 100644 --- a/tests/RemoteVacationTest.php +++ b/tests/RemoteVacationTest.php @@ -13,7 +13,7 @@ class RemoteVacationTest extends RemoteTest { /** * Adds the test recipient data to the database. */ - public function setUp() { + public function setUp() : void { // Ensure config.inc.php is vaguely correct. global $CONF; if ($CONF['vacation'] != 'YES' || $CONF['vacation_control'] != "YES") { @@ -36,7 +36,7 @@ class RemoteVacationTest extends RemoteTest { public function testGetDetails() { $details = $this->vacation->getDetails(); - $this->assertFalse($details); // empty by default (thansk to tearDown/setUp); + $this->assertFalse($details); // empty by default (thanks to tearDown/setUp); } public function testSetAway() { diff --git a/tests/bootstrap.php b/tests/bootstrap.php index c4362aee..01186271 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -22,7 +22,7 @@ if (getenv('DATABASE') == 'sqlite' || getenv('DATABASE') == false) { } touch($db_file); - echo "Using: SQLite database for tests - $db_file \n"; + error_log("Using: SQLite database for tests - $db_file"); } if (getenv('DATABASE') == 'postgresql') { $user = getenv('PGUSER') ?: 'postgres'; @@ -40,7 +40,7 @@ if (getenv('DATABASE') == 'postgresql') { Config::write('database_name', 'postfixadmin'); Config::write('database_host', $host); - echo "Using: PostgreSQL database for tests\n"; + error_log("Using: PostgreSQL database for tests\n"); } if (getenv('DATABASE') == 'mysql') { @@ -76,7 +76,7 @@ if (getenv('DATABASE') == 'mysql') { Config::write('database_password', $config['password']); Config::write('database_name', 'postfixadmin'); - echo "Using: MySQL database for tests\n"; + error_log("Using: MySQL database for tests"); } try { From ffc7787b76643f0381144e562a2a517eae41eeb8 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Tue, 14 Apr 2020 21:09:18 +0100 Subject: [PATCH 022/691] psalm fix --- model/AliasHandler.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/model/AliasHandler.php b/model/AliasHandler.php index dfa39e0b..debaeccf 100644 --- a/model/AliasHandler.php +++ b/model/AliasHandler.php @@ -309,9 +309,13 @@ class AliasHandler extends PFAHandler { } protected function read_from_db_postprocess($db_result) { + foreach ($db_result as $key => $value) { # split comma-separated 'goto' into an array - $db_result[$key]['goto'] = explode(',', $db_result[$key]['goto']); + $goto = $db_result[$key]['goto'] ?? null; + if(is_string($goto)) { + $db_result[$key]['goto'] = explode(',', $goto); + } # Vacation enabled? list($db_result[$key]['on_vacation'], $db_result[$key]['goto']) = remove_from_array($db_result[$key]['goto'], $this->getVacationAlias()); From f8415eef2a6fdec77c8f15d59d861b1860f72b81 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Tue, 14 Apr 2020 21:25:25 +0100 Subject: [PATCH 023/691] remove cache suppression --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e08eae1c..e07a60cb 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "lint": "@php ./vendor/bin/parallel-lint --exclude vendor/ --exclude lib/block_random_int.php --exclude lib/array_column.php .", "test": "DATABASE=sqlite ./vendor/bin/phpunit --coverage-clover ./clover.xml tests/", "test-fixup": "mkdir -p templates_c ; test -f config.local.php || touch config.local.php", - "psalm": "@php ./vendor/bin/psalm --no-cache --show-info=false " + "psalm": "@php ./vendor/bin/psalm --show-info=false " }, "require": { "php": ">=7.0" From e4158d6d7e24d52fc6837b0b5e817c2345f32747 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Tue, 14 Apr 2020 21:25:36 +0100 Subject: [PATCH 024/691] psalm fix --- model/AliasHandler.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/model/AliasHandler.php b/model/AliasHandler.php index debaeccf..6aafe86a 100644 --- a/model/AliasHandler.php +++ b/model/AliasHandler.php @@ -309,11 +309,10 @@ class AliasHandler extends PFAHandler { } protected function read_from_db_postprocess($db_result) { - foreach ($db_result as $key => $value) { # split comma-separated 'goto' into an array $goto = $db_result[$key]['goto'] ?? null; - if(is_string($goto)) { + if (is_string($goto)) { $db_result[$key]['goto'] = explode(',', $goto); } From 844840c6a8e90098dd83dccb88ca96317863de4b Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Tue, 14 Apr 2020 21:26:01 +0100 Subject: [PATCH 025/691] simplify Config use; drop support for dotty name notation which we are not using --- model/Config.php | 77 ++++++++---------------------------------------- 1 file changed, 13 insertions(+), 64 deletions(-) diff --git a/model/Config.php b/model/Config.php index 7b949901..7eabfd68 100644 --- a/model/Config.php +++ b/model/Config.php @@ -50,33 +50,22 @@ final class Config { $newConfig = $_this->getAll(); - foreach ($config as $names => $value) { - $name = $_this->__configVarNames($names); - - switch (count($name)) { - case 3: - $newConfig[$name[0]][$name[1]][$name[2]] = $value; - break; - case 2: - $newConfig[$name[0]][$name[1]] = $value; - break; - case 1: - $newConfig[$name[0]] = $value; - break; - } + foreach ($config as $name => $value) { + $newConfig[$name] = $value; } + $_this->setAll($newConfig); } /** - * @return array * @param string $var + * @return array */ public static function read_array($var) { $stuff = self::read($var); if (!is_array($stuff)) { - trigger_error('In '.__FUNCTION__.": expected config $var to be an array, but received a " . gettype($stuff), E_USER_ERROR); + trigger_error('In ' . __FUNCTION__ . ": expected config $var to be an array, but received a " . gettype($stuff), E_USER_ERROR); } return $stuff; @@ -94,7 +83,7 @@ final class Config { } if (!is_string($stuff)) { - trigger_error('In '.__FUNCTION__.": expected config $var to be a string, but received a " . gettype($stuff), E_USER_ERROR); + trigger_error('In ' . __FUNCTION__ . ": expected config $var to be a string, but received a " . gettype($stuff), E_USER_ERROR); return ''; } @@ -121,34 +110,12 @@ final class Config { return $config; } - $name = $_this->__configVarNames($var); - - switch (count($name)) { - case 3: - $zero = $name[0]; - $one = $name[1]; - $two = $name[2]; - if (isset($config[$zero], $config[$zero][$one], $config[$zero][$one][$two])) { - return $config[$zero][$one][$two]; - } - break; - case 2: - $zero = $name[0]; - $one = $name[1]; - if (isset($config[$zero], $config[$zero][$one])) { - return $config[$zero][$one]; - } - break; - case 1: - $zero = $name[0]; - if (isset($config[$zero])) { - return $config[$zero]; - } - break; + if (isset($config[$var])) { + return $config[$var]; } - if (!in_array(join('.', $name), self::$deprecated_options)) { - error_log('Config::read(): attempt to read undefined config option "' . join('.', $name) . '", returning null'); + if (!in_array($var, self::$deprecated_options)) { + error_log('Config::read(): attempt to read undefined config option "' . $var . '", returning null'); } return null; @@ -194,7 +161,7 @@ final class Config { } if (!is_string($value)) { - trigger_error('In '.__FUNCTION__.": expected config $var to be a string, but received a " . gettype($value), E_USER_ERROR); + trigger_error('In ' . __FUNCTION__ . ": expected config $var to be a string, but received a " . gettype($value), E_USER_ERROR); error_log("config $var should be a string, found: " . json_encode($value)); return false; } @@ -222,7 +189,6 @@ final class Config { } - /** * Get translated text from $PALANG * (wrapper for self::read(), see also the comments there) @@ -239,7 +205,7 @@ final class Config { } if (!is_string($value)) { - trigger_error('In '.__FUNCTION__.": expected config $var to be a string , but received a " . gettype($value), E_USER_ERROR); + trigger_error('In ' . __FUNCTION__ . ": expected config $var to be a string , but received a " . gettype($value), E_USER_ERROR); } return $value; } @@ -253,7 +219,7 @@ final class Config { * @return string value of $PALANG[$var], parsed by sprintf */ public static function lang_f($var, $value) { - return self::read_f('__LANG.'. $var, $value); + return self::read_f('__LANG.' . $var, $value); } /** @@ -270,23 +236,6 @@ final class Config { public function setAll(array $config) { $this->config = $config; } - - /** - * Checks $name for dot notation to create dynamic Configure::$var as an array when needed. - * - * @param mixed $name Name to split - * @return array Name separated in items through dot notation - * @access private - */ - private function __configVarNames($name) { - if (is_string($name)) { - if (strpos($name, ".")) { - return explode(".", $name); - } - return array($name); - } - return $name; - } } /* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */ From f17c722f0b1fcad0798a84680843cc51cd455408 Mon Sep 17 00:00:00 2001 From: drakos <4613678+Jolly-Pirate@users.noreply.github.com> Date: Sat, 18 Apr 2020 17:50:30 -0400 Subject: [PATCH 026/691] Flush privileges Must `FLUSH PRIVILEGES;` after granting. --- INSTALL.TXT | 1 + 1 file changed, 1 insertion(+) diff --git a/INSTALL.TXT b/INSTALL.TXT index d3d3c334..07e40b5f 100644 --- a/INSTALL.TXT +++ b/INSTALL.TXT @@ -85,6 +85,7 @@ For MySQL: CREATE DATABASE postfix; CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'choose_a_password'; GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost'; + FLUSH PRIVILEGES; For PostgreSQL: CREATE USER postfix WITH PASSWORD 'whatever'; From 44c3ac5e201ec7ec37e1681527b0b659bb8ba297 Mon Sep 17 00:00:00 2001 From: Christian Boltz Date: Wed, 22 Apr 2020 00:26:45 +0200 Subject: [PATCH 027/691] language-update.sh: silence warning about undefined $CONF variable This warning was for example PHP Notice: Undefined variable: CONF in .../languages/en.lang on line 184 and is caused by some texts that include $CONF['admin_name'] --- languages/language-update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/language-update.sh b/languages/language-update.sh index a0a36b2c..55b8a304 100755 --- a/languages/language-update.sh +++ b/languages/language-update.sh @@ -21,7 +21,7 @@ function update_string_list() { for file in en.lang $filelist ; do - echo "" | php > $file.strings + echo "" | php > $file.strings done for file in $filelist ; do From fd48714615dfc9554cbf8b097bcb80682e6c8d69 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Wed, 22 Apr 2020 09:34:25 +0100 Subject: [PATCH 028/691] fix issue reported with __LANG.$var - https://github.com/postfixadmin/postfixadmin/commit/844840c6a8e90098dd83dccb88ca96317863de4b#commitcomment-38653465 --- model/Config.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/model/Config.php b/model/Config.php index 7eabfd68..6e415d69 100644 --- a/model/Config.php +++ b/model/Config.php @@ -115,7 +115,7 @@ final class Config { } if (!in_array($var, self::$deprecated_options)) { - error_log('Config::read(): attempt to read undefined config option "' . $var . '", returning null'); + error_log('Config::read(): attempt to read undefined config option "' . $var . '", returning null' . json_encode(debug_backtrace(), true)); } return null; @@ -198,15 +198,15 @@ final class Config { * @access public */ public static function lang($var) { - $value = self::read("__LANG.{$var}"); - if (is_null($value)) { - return ''; - } + $languages = self::read_array('__LANG'); + + $value = $languages[$var] ?? ''; if (!is_string($value)) { trigger_error('In ' . __FUNCTION__ . ": expected config $var to be a string , but received a " . gettype($value), E_USER_ERROR); } + return $value; } From df9a400ea245d6256ad000f4fd37ee84bd071639 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Wed, 22 Apr 2020 09:37:31 +0100 Subject: [PATCH 029/691] remove debug stuff --- model/Config.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/model/Config.php b/model/Config.php index 6e415d69..4eb94366 100644 --- a/model/Config.php +++ b/model/Config.php @@ -115,7 +115,7 @@ final class Config { } if (!in_array($var, self::$deprecated_options)) { - error_log('Config::read(): attempt to read undefined config option "' . $var . '", returning null' . json_encode(debug_backtrace(), true)); + error_log('Config::read(): attempt to read undefined config option "' . $var . '", returning null'); } return null; @@ -198,7 +198,6 @@ final class Config { * @access public */ public static function lang($var) { - $languages = self::read_array('__LANG'); $value = $languages[$var] ?? ''; From fc464d6e692a6d3b7c2b6ca39084d1977ee6fc56 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sun, 26 Apr 2020 14:44:45 +0100 Subject: [PATCH 030/691] update INSTALL.TXT - see also #349 --- INSTALL.TXT | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/INSTALL.TXT b/INSTALL.TXT index 07e40b5f..3a08262e 100644 --- a/INSTALL.TXT +++ b/INSTALL.TXT @@ -7,14 +7,13 @@ REQUIREMENTS ------------ -- Postfix 2.0 or higher. -- Apache 1.3.27 / Lighttpd 1.3.15 or higher. -- PHP 5.1.2 or higher. +- Postfix +- Apache / Lighttpd +- PHP (for web server) - one of the following databases: - - MySQL 3.23 or higher (5.x recommended) - - MariaDB (counts as MySQL ;-) - - PostgreSQL 7.4 (or higher) - - SQLite 3.12 (or higher) + - MariaDB/MySQL + - PostgreSQL + - SQLite READ THIS FIRST! @@ -42,10 +41,10 @@ DOCUMENTS/ folder. (if you installed PostfixAdmin as RPM or DEB package, you can obviously skip this step.) -Assuming we are installing Postfixadmin into /srv/postfixadmin, then something like this should work : +Assuming we are installing Postfixadmin into /srv/postfixadmin, then something like this should work. Please check https://github.com/postfixadmin/postfixadmin/releases to get the latest stable release first (the 3.2.4 version/url below is probably stale) $ cd /srv/ - $ wget -O postfixadmin.tgz https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-3.2.tar.gz + $ wget -O postfixadmin.tgz https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-3.2.4.tar.gz $ tar -zxvf postfixadmin.tgz $ mv postfixadmin-postfixadmin-3.2 postfixadmin @@ -54,7 +53,7 @@ Alternatively : $ cd /srv $ git clone https://github.com/postfixadmin/postfixadmin.git $ cd postfixadmin - $ git checkout postfixadmin-3.2.2 + $ git checkout postfixadmin-3.2.4 2. Setup Web Server ------------------- From 4e9e3db75dfc4fb9a57b9ba1b403828f35cd5840 Mon Sep 17 00:00:00 2001 From: Christian Boltz Date: Sat, 2 May 2020 01:17:34 +0200 Subject: [PATCH 031/691] Fix parameter parsing for '-1' '--quota -1' gets parsed as two options ("quota" and "1"), but it's meant to be "quota => -1". Make sure '-1' is considered as a value, not as an option. Also get rid of unset()'ing $params[$i] and (now?) superfluous recursive calls to __parseParams() to make the code less confusing. --- scripts/postfixadmin-cli.php | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/scripts/postfixadmin-cli.php b/scripts/postfixadmin-cli.php index 5c12b9ad..0ea75fa3 100644 --- a/scripts/postfixadmin-cli.php +++ b/scripts/postfixadmin-cli.php @@ -323,26 +323,22 @@ class PostfixAdmin { private function __parseParams($params) { $count = count($params); for ($i = 0; $i < $count; $i++) { - if (isset($params[$i])) { - if ($params[$i] != '' && $params[$i]{0} === '-') { +# if (isset($params[$i])) { + if ($params[$i] != '' && $params[$i]{0} === '-' && $params[$i] != '-1') { $key = substr($params[$i], 1); - $this->params[$key] = true; - unset($params[$i]); - if (isset($params[++$i])) { + if (isset($params[$i+1])) { # TODO: ideally we should know if a parameter can / must have a value instead of whitelisting known valid values starting with '-' (probably only bool doesn't need a value) - if ($params[$i]{0} !== '-' or $params[$i] != '-1') { - $this->params[$key] = $params[$i]; - unset($params[$i]); + if ($params[$i+1]{0} === '-' && $params[$i+1] != '-1') { + $this->params[$key] = true; } else { - $i--; - $this->__parseParams($params); + $this->params[$key] = $params[$i+1]; + $i++; } } } else { $this->args[] = $params[$i]; - unset($params[$i]); } - } +# } } } From 9833a8f289df76988528b605d21f4580f33e3ea8 Mon Sep 17 00:00:00 2001 From: Christian Boltz Date: Sat, 2 May 2020 01:26:35 +0200 Subject: [PATCH 032/691] whitespace fix in __parseParams() --- scripts/postfixadmin-cli.php | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/scripts/postfixadmin-cli.php b/scripts/postfixadmin-cli.php index 0ea75fa3..91c609d9 100644 --- a/scripts/postfixadmin-cli.php +++ b/scripts/postfixadmin-cli.php @@ -323,22 +323,20 @@ class PostfixAdmin { private function __parseParams($params) { $count = count($params); for ($i = 0; $i < $count; $i++) { -# if (isset($params[$i])) { - if ($params[$i] != '' && $params[$i]{0} === '-' && $params[$i] != '-1') { - $key = substr($params[$i], 1); - if (isset($params[$i+1])) { - # TODO: ideally we should know if a parameter can / must have a value instead of whitelisting known valid values starting with '-' (probably only bool doesn't need a value) - if ($params[$i+1]{0} === '-' && $params[$i+1] != '-1') { - $this->params[$key] = true; - } else { - $this->params[$key] = $params[$i+1]; - $i++; - } + if ($params[$i] != '' && $params[$i]{0} === '-' && $params[$i] != '-1') { + $key = substr($params[$i], 1); + if (isset($params[$i+1])) { + # TODO: ideally we should know if a parameter can / must have a value instead of whitelisting known valid values starting with '-' (probably only bool doesn't need a value) + if ($params[$i+1]{0} === '-' && $params[$i+1] != '-1') { + $this->params[$key] = true; + } else { + $this->params[$key] = $params[$i+1]; + $i++; } - } else { - $this->args[] = $params[$i]; } -# } + } else { + $this->args[] = $params[$i]; + } } } From ad4142134a50af6a9884984e74fc0103fb458062 Mon Sep 17 00:00:00 2001 From: Christian Boltz Date: Sat, 2 May 2020 01:30:25 +0200 Subject: [PATCH 033/691] merge __parseParams() into parseParams() --- scripts/postfixadmin-cli.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/scripts/postfixadmin-cli.php b/scripts/postfixadmin-cli.php index 91c609d9..934f47ed 100644 --- a/scripts/postfixadmin-cli.php +++ b/scripts/postfixadmin-cli.php @@ -314,13 +314,6 @@ class PostfixAdmin { * @param array $params Parameters to parse */ public function parseParams($params) { - $this->__parseParams($params); - } - - /** - * Helper for recursively parsing params - */ - private function __parseParams($params) { $count = count($params); for ($i = 0; $i < $count; $i++) { if ($params[$i] != '' && $params[$i]{0} === '-' && $params[$i] != '-1') { From 85e15790bb6ae6ecc896324baa521a2e6f769479 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 2 May 2020 19:08:47 +0100 Subject: [PATCH 034/691] should fix: #351 --- model/Config.php | 13 ++++++++++++- tests/ConfigTest.php | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 tests/ConfigTest.php diff --git a/model/Config.php b/model/Config.php index 4eb94366..53f2586e 100644 --- a/model/Config.php +++ b/model/Config.php @@ -218,7 +218,18 @@ final class Config { * @return string value of $PALANG[$var], parsed by sprintf */ public static function lang_f($var, $value) { - return self::read_f('__LANG.' . $var, $value); + $all = self::read_array('__LANG'); + + $text = $all[$var] ?? ''; + + $newtext = sprintf($text, $value); + + # check if sprintf changed something - if not, there are chances that $text didn't contain a %s + if ($text == $newtext) { + error_log("$var used via read_f, but nothing replaced (value $value)"); + } + + return $newtext; } /** diff --git a/tests/ConfigTest.php b/tests/ConfigTest.php new file mode 100644 index 00000000..33a84d62 --- /dev/null +++ b/tests/ConfigTest.php @@ -0,0 +1,33 @@ +getAll(); + + $all['xmlrpc_enabled'] = false; + + $c->setAll($all); + + parent::setUp(); + } + + public function testLangF() { + $x = Config::lang_f('must_be_numeric', 'foo@bar'); + + $this->assertEquals('foo@bar must be numeric', $x); + } + + public function testLang() { + $x = Config::lang('must_be_numeric', 'foo@bar'); + + $this->assertEquals('%s must be numeric', $x); + } + + public function testBool() { + $x = Config::bool('xmlrpc_enabled'); + + $this->assertFalse($x); + } +} From 052f2faffb7ca74692d3a986da5ba540d2d9536a Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 2 May 2020 19:12:44 +0100 Subject: [PATCH 035/691] do not fail on error from coveralls --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index bc6261f3..41674b58 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -29,6 +29,6 @@ jobs: run: mkdir -p build/logs || true - name: Coveralls - run: vendor/bin/coveralls ./clover.xml + run: vendor/bin/coveralls ./clover.xml || true env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} From 192c797fe19c7818d5ed356fb91094ffa2e4b5fa Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sun, 10 May 2020 13:01:33 +0100 Subject: [PATCH 036/691] add a support block to compoer.json --- composer.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/composer.json b/composer.json index e07a60cb..938f17e8 100644 --- a/composer.json +++ b/composer.json @@ -38,5 +38,10 @@ "functions.inc.php", "lib/smarty/libs/bootstrap.php" ] + }, + "support": { + "irc": "irc://irc.freenode.org/postfixadmin", + "issues": "https://github.com/postfixadmin/postfixadmin/issues", + "chat": "https://gitter.im/postfixadmin/Lobby" } } From 864065cd37ef34b6dab915206eea4bd2ac4ebaed Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Fri, 15 May 2020 20:30:31 +0100 Subject: [PATCH 037/691] fix MailboxHandler -> adding mailbox with empty quota field --- model/MailboxHandler.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/model/MailboxHandler.php b/model/MailboxHandler.php index 05a3deaf..69df0188 100644 --- a/model/MailboxHandler.php +++ b/model/MailboxHandler.php @@ -227,6 +227,11 @@ class MailboxHandler extends PFAHandler { $this->values['quota'] = $this->values['quota'] * $multiplier; # convert quota from MB to bytes } + // Avoid trying to store '' in an integer field + if($this->values['quota'] === '') { + $this->values['quota'] = 0; + } + $ah = new AliasHandler($this->new, $this->admin_username); $ah->calledBy('MailboxHandler'); From d3a5db394cb3e028ea8d4ce44ede15c37d8ed445 Mon Sep 17 00:00:00 2001 From: Phil Jaenke Date: Fri, 15 May 2020 16:06:59 -0400 Subject: [PATCH 038/691] Make pInvalidDomainDNS more forgiving Make the pInvalidDomainDNS check more forgiving to accommodate newly created domains which also do not have an A record for the domain (which is generally not a best practice) or MX configured yet. This adds a check for an `NS` record; if the NS exists, then the domain is valid and can be assumed to have just not been configured to receive email yet. --- functions.inc.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/functions.inc.php b/functions.inc.php index 6e74f9c3..3c63ff1c 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -248,6 +248,8 @@ function check_domain($domain) { $retval = ''; } elseif (checkdnsrr($domain, 'MX')) { $retval = ''; + } elseif (checkdnsrr($domain, 'NS')) { + $retval = ''; } else { $retval = sprintf(Config::lang('pInvalidDomainDNS'), htmlentities($domain)); } From 2bb2460bf32190831a9d638276e1ae383424358a Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Tue, 2 Jun 2020 12:54:26 +0100 Subject: [PATCH 039/691] add in error_log call just incase it helps someone --- functions.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/functions.inc.php b/functions.inc.php index 3c63ff1c..7fd86362 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -249,6 +249,7 @@ function check_domain($domain) { } elseif (checkdnsrr($domain, 'MX')) { $retval = ''; } elseif (checkdnsrr($domain, 'NS')) { + error_log("DNS is not correctly configured for $domain to send or receive email"); $retval = ''; } else { $retval = sprintf(Config::lang('pInvalidDomainDNS'), htmlentities($domain)); From befc18154fb1ce60c8dc4aa7aeed84dce95e7817 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Tue, 2 Jun 2020 12:56:18 +0100 Subject: [PATCH 040/691] see: https://github.com/postfixadmin/postfixadmin/commit/86852b3dbdbc8b9a3923d5186d2f32f630328ccf#r39604078 - fix MX lookup --- VIRTUAL_VACATION/vacation.pl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/VIRTUAL_VACATION/vacation.pl b/VIRTUAL_VACATION/vacation.pl index 293bc95e..62b7e061 100644 --- a/VIRTUAL_VACATION/vacation.pl +++ b/VIRTUAL_VACATION/vacation.pl @@ -440,7 +440,7 @@ sub send_vacation_email { $logger->debug("Will send vacation response for $orig_messageid: FROM: $email (orig_to: $orig_to), TO: $orig_from; VACATION SUBJECT: $row[0] ; VACATION BODY: $row[1]"); my $subject = $row[0]; - $subject = Encode::decode_utf8( $subject ) if( !Encode::is_utf8( $subject ) ); + $subject = Encode::decode_utf8( $subject ) if( !Encode::is_utf8( $subject ) ); $orig_subject = decode("mime-header", $orig_subject); $subject =~ s/\$SUBJECT/$orig_subject/g; if ($subject ne $row[0]) { @@ -448,12 +448,13 @@ sub send_vacation_email { } my $body = $row[1]; - $body = Encode::decode_utf8( $body ) if( !Encode::is_utf8( $body ) ); + $body = Encode::decode_utf8( $body ) if( !Encode::is_utf8( $body ) ); + my $from = $email; my $to = $orig_from; # part of the username in the email && part of the domain in the email - my ($email_username_part, $email_domain_part) = split(/@/, $email); + my ($email_username_part, $email_domain_part) = split(/@/, $orig_from); my $resolver = Net::DNS::Resolver->new; my @mx = mx($resolver, $email_domain_part); From bbf41c7accca9b3822f1d02c0f2e073968b6ce8b Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Tue, 2 Jun 2020 12:59:47 +0100 Subject: [PATCH 041/691] formatting --- model/MailboxHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/MailboxHandler.php b/model/MailboxHandler.php index 69df0188..8a0f34f7 100644 --- a/model/MailboxHandler.php +++ b/model/MailboxHandler.php @@ -228,7 +228,7 @@ class MailboxHandler extends PFAHandler { } // Avoid trying to store '' in an integer field - if($this->values['quota'] === '') { + if ($this->values['quota'] === '') { $this->values['quota'] = 0; } From d668655c36d72da2458e6b5c7d93e62cf348d489 Mon Sep 17 00:00:00 2001 From: Hitoshi Kurokawa Date: Mon, 8 Jun 2020 18:35:26 +0900 Subject: [PATCH 042/691] add missing semicolon --- ADDITIONS/mailbox_remover.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ADDITIONS/mailbox_remover.pl b/ADDITIONS/mailbox_remover.pl index 02416242..fa27ecc0 100644 --- a/ADDITIONS/mailbox_remover.pl +++ b/ADDITIONS/mailbox_remover.pl @@ -117,7 +117,7 @@ foreach my $maildir (keys(%directories)) { close(TOUCH); print "Archiving $maildir\n"; @args = ($archcmd, "cvzf", $archive, $maildir); - system(@args) == 0 or die "Creating archive for $maildir failed: $?" + system(@args) == 0 or die "Creating archive for $maildir failed: $?"; rmtree($maildir); print localtime() . " $maildir has been deleted.\n"; From d6385c03ffdd580b5604d08e6d0eaaa92f84e091 Mon Sep 17 00:00:00 2001 From: Yannick Markus Date: Mon, 15 Jun 2020 15:14:11 +0200 Subject: [PATCH 043/691] fix vacation.pl resolver --- VIRTUAL_VACATION/vacation.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VIRTUAL_VACATION/vacation.pl b/VIRTUAL_VACATION/vacation.pl index 62b7e061..ed18d964 100644 --- a/VIRTUAL_VACATION/vacation.pl +++ b/VIRTUAL_VACATION/vacation.pl @@ -454,7 +454,7 @@ sub send_vacation_email { my $to = $orig_from; # part of the username in the email && part of the domain in the email - my ($email_username_part, $email_domain_part) = split(/@/, $orig_from); + my ($email_username_part, $email_domain_part) = split(/@/, $email); my $resolver = Net::DNS::Resolver->new; my @mx = mx($resolver, $email_domain_part); From ca24ff830078ba0ca284521c16ef1053e0a5cb77 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 15 Jun 2020 17:12:42 +0100 Subject: [PATCH 044/691] perhaps improve logging - see : https://github.com/postfixadmin/postfixadmin/issues/364 --- public/upgrade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/public/upgrade.php b/public/upgrade.php index 0f564772..3af5e845 100644 --- a/public/upgrade.php +++ b/public/upgrade.php @@ -329,6 +329,7 @@ function db_query_parsed($sql, $ignore_errors = 0, $attach_mysql = "") { try { $result = db_execute($query, array(), true); } catch (PDOException $e) { + error_log("Exception running PostfixAdmin query: $query " . $e); if ($debug) { echo_out("
    " . $e->getMessage() . "
    "); } From e8f27969a3a1be7461efc3ece169605fec4c5f43 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sun, 21 Jun 2020 16:44:43 +0100 Subject: [PATCH 045/691] psalm fixes --- model/AdminHandler.php | 2 +- model/AliasHandler.php | 3 ++- model/AliasdomainHandler.php | 3 ++- model/DomainHandler.php | 2 +- model/FetchmailHandler.php | 9 +++++---- model/PFAHandler.php | 8 ++++---- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/model/AdminHandler.php b/model/AdminHandler.php index 418627eb..9f898d65 100644 --- a/model/AdminHandler.php +++ b/model/AdminHandler.php @@ -183,7 +183,7 @@ class AdminHandler extends PFAHandler { } /** - * @return true on success false on failure + * @return bool */ public function delete() { if (! $this->view()) { diff --git a/model/AliasHandler.php b/model/AliasHandler.php index 6aafe86a..387e9b2c 100644 --- a/model/AliasHandler.php +++ b/model/AliasHandler.php @@ -440,6 +440,7 @@ class AliasHandler extends PFAHandler { * Returns the vacation alias for this user. * i.e. if this user's username was roger@example.com, and the autoreply domain was set to * autoreply.fish.net in config.inc.php we'd return roger#example.com@autoreply.fish.net + * * @return string an email alias. */ protected function getVacationAlias() { @@ -448,7 +449,7 @@ class AliasHandler extends PFAHandler { } /** - * @return true on success false on failure + * @return boolean */ public function delete() { if (! $this->view()) { diff --git a/model/AliasdomainHandler.php b/model/AliasdomainHandler.php index 6b28af25..e2f3cb81 100644 --- a/model/AliasdomainHandler.php +++ b/model/AliasdomainHandler.php @@ -100,7 +100,7 @@ class AliasdomainHandler extends PFAHandler { /** - * @return true on success false on failure + * @return boolean */ public function delete() { if (! $this->view()) { @@ -118,6 +118,7 @@ class AliasdomainHandler extends PFAHandler { /** * validate target_domain field - it must be != $this->id to avoid a loop + * @return boolean */ protected function _validate_target_domain($field, $val) { if ($val == $this->id) { diff --git a/model/DomainHandler.php b/model/DomainHandler.php index 40b0bb7e..c919c3b9 100644 --- a/model/DomainHandler.php +++ b/model/DomainHandler.php @@ -191,7 +191,7 @@ class DomainHandler extends PFAHandler { } /** - * @return true on success false on failure + * @return bool */ public function delete() { # TODO: check for _can_delete instead diff --git a/model/FetchmailHandler.php b/model/FetchmailHandler.php index 182f41bb..163ecae9 100644 --- a/model/FetchmailHandler.php +++ b/model/FetchmailHandler.php @@ -107,7 +107,7 @@ class FetchmailHandler extends PFAHandler { /** - * @return true on success false on failure + * @return boolean */ public function delete() { if (! $this->view()) { @@ -124,7 +124,7 @@ class FetchmailHandler extends PFAHandler { } - /* + /** * validate src_server - must be non-empty and survive check_domain() */ protected function _validate_src_server($field, $val) { @@ -142,7 +142,7 @@ class FetchmailHandler extends PFAHandler { } } - /* + /** * validate src_user and src_password - must be non-empty * (we can't assume anything about valid usernames and passwords on remote * servers, so the validation can't be more strict) @@ -154,6 +154,7 @@ class FetchmailHandler extends PFAHandler { } return true; } + protected function _validate_src_password($field, $val) { if ($val == '') { $this->errormsg[$field] = Config::lang('pFetchmail_password_missing'); @@ -162,7 +163,7 @@ class FetchmailHandler extends PFAHandler { return true; } - /* + /** * validate poll interval - must be numeri and > 0 */ protected function _validate_poll_time($field, $val) { diff --git a/model/PFAHandler.php b/model/PFAHandler.php index aaafddac..4e7a5a2a 100644 --- a/model/PFAHandler.php +++ b/model/PFAHandler.php @@ -790,11 +790,11 @@ abstract class PFAHandler { /** * get a list of one or more items with all values - * @param array or string $condition - see read_from_db for details + * @param array|string $condition - see read_from_db for details * WARNING: will be changed to array only in the future, with an option to include a raw string inside the array - * @param array - modes to use if $condition is an array - see read_from_db for details - * @param integer limit - maximum number of rows to return - * @param integer offset - number of first row to return + * @param array $searchmode - modes to use if $condition is an array - see read_from_db for details + * @param int $limit - maximum number of rows to return + * @param int $offset - number of first row to return * @return bool - always true, no need to check ;-) (if $result is not an array, getList die()s) * The data is stored in $this->result (as array of rows, each row is an associative array of column => value) */ From d49de351896f49a3cc2a7c13674fae54abcc29e2 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Tue, 23 Jun 2020 21:14:29 +0100 Subject: [PATCH 046/691] improve docs --- scripts/postfixadmin-cli.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/postfixadmin-cli.php b/scripts/postfixadmin-cli.php index 934f47ed..782c01a8 100644 --- a/scripts/postfixadmin-cli.php +++ b/scripts/postfixadmin-cli.php @@ -146,7 +146,10 @@ class PostfixAdmin { } /** - * Dispatches a CLI request + * postfixadmin-cli admin view admin@example.com + * - Create AdminHandler. + * - and then a CliView object (Shell class) + * - call CliView->view() ... which under the covers uses AdminHandler* */ public function dispatch() { check_db_version(); # ensure the database layout is up to date From ef1fb36133f81e70d95054f9ca9e58456c640fb7 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Tue, 23 Jun 2020 21:43:19 +0100 Subject: [PATCH 047/691] improve unit tests for PostgreSQL --- tests/AliasHandlerTest.php | 2 +- tests/MailboxHandlerTest.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/AliasHandlerTest.php b/tests/AliasHandlerTest.php index b6e685c6..dcf3382d 100644 --- a/tests/AliasHandlerTest.php +++ b/tests/AliasHandlerTest.php @@ -12,8 +12,8 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { public function tearDown() : void { $_SESSION = []; db_query('DELETE FROM alias'); - db_query('DELETE FROM domain'); db_query('DELETE FROM domain_admins'); + db_query('DELETE FROM domain'); parent::tearDown(); } diff --git a/tests/MailboxHandlerTest.php b/tests/MailboxHandlerTest.php index 7905d88f..e2597d03 100644 --- a/tests/MailboxHandlerTest.php +++ b/tests/MailboxHandlerTest.php @@ -3,8 +3,9 @@ class MailboxHandlerTest extends \PHPUnit\Framework\TestCase { public function tearDown() : void { db_query('DELETE FROM mailbox'); - db_query('DELETE FROM domain'); + db_query('DELETE FROM alias'); db_query('DELETE FROM domain_admins'); + db_query('DELETE FROM domain'); parent::tearDown(); } From 502bfca2f56623941cd11c0aff2745c0ae830a71 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 6 Aug 2020 15:33:37 +0100 Subject: [PATCH 048/691] try and improve error handling if doveadm is not present etc - see https://github.com/postfixadmin/postfixadmin/issues/373 --- functions.inc.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/functions.inc.php b/functions.inc.php index 7fd86362..d0bfe385 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -1032,13 +1032,19 @@ function _pacrypt_dovecot($pw, $pw_db = '') { fwrite($pipes[0], $pw . "\n", 1+strlen($pw)); fclose($pipes[0]); + $stderr_output = stream_get_contents($pipes[2]); + // Read hash from pipe stdout $password = fread($pipes[1], 200); + if (empty($password)) { + error_log("Failed to read password from $dovecotpw ... stderr: $stderr_output "); + throw new Exception("$dovecotpw failed, see error log for details"); + } + if (empty($dovepasstest)) { if (!preg_match('/^\{' . $method . '\}/', $password)) { - $stderr_output = stream_get_contents($pipes[2]); - error_log('dovecotpw password encryption failed. STDERR output: '. $stderr_output); + error_log("dovecotpw password encryption failed (method: $method) . stderr: $stderr_output"); throw new Exception("can't encrypt password with dovecotpw, see error log for details"); } } else { From c3d5b26740d2461f86a18f718bffc7db26cf49c5 Mon Sep 17 00:00:00 2001 From: GermanCoding Date: Sat, 20 Jun 2020 00:20:29 +0200 Subject: [PATCH 049/691] Disallow aliases that point to themselves (fixes postfixadmin/postfixadmin/issues/358) See github.com/postfixadmin/postfixadmin/issues/358 for details --- model/AliasHandler.php | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/model/AliasHandler.php b/model/AliasHandler.php index 387e9b2c..10117489 100644 --- a/model/AliasHandler.php +++ b/model/AliasHandler.php @@ -390,16 +390,41 @@ class AliasHandler extends PFAHandler { # Note: alias domains are better, but we should keep this way supported for backward compatibility # and because alias domains can't forward to external domains list(/*NULL*/, $domain) = explode('@', $singlegoto); + $domain_check = check_domain($domain); if ($domain_check != '') { $errors[] = "$singlegoto: $domain_check"; } + + $localaliasonly_check = check_localaliasonly($domain); + if ($localaliasonly_check != '') { + $errors[] = "$singlegoto: $localaliasonly_check"; + } + + if($this->called_by != "MailboxHandler" && $this->id == $singlegoto) { + // The MailboxHandler needs to create an alias that is points to itself (for the mailbox) + // Otherwise, disallow such aliases as they cause severe trouble in the mail system + $errors[] = "$singlegoto: Alias may not point to itself"; + } + } else { $email_check = check_email($singlegoto); // preg_match -> allows for redirect to a local system account. if ($email_check != '' && !preg_match('/^[a-z0-9]+$/', $singlegoto)) { $errors[] = "$singlegoto: $email_check"; } + + $localaliasonly_check = check_localaliasonly($singlegoto); + if ($localaliasonly_check != '') { + $errors[] = "$singlegoto: $localaliasonly_check"; + } + + if($this->called_by != "MailboxHandler" && $this->id == $singlegoto) { + // The MailboxHandler needs to create an alias that is points to itself (for the mailbox) + // Otherwise, disallow such aliases as they cause severe trouble in the mail system + $errors[] = "$singlegoto: Alias may not point to itself"; + } + } } From 57a47874738e9b94f3c8168ed92f2764efb80ad3 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 6 Aug 2020 19:42:34 +0100 Subject: [PATCH 050/691] abort on any stderr output from doveadm ... see: https://github.com/postfixadmin/postfixadmin/issues/373#issuecomment-670007084 --- functions.inc.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/functions.inc.php b/functions.inc.php index d0bfe385..b153839a 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -1029,6 +1029,7 @@ function _pacrypt_dovecot($pw, $pw_db = '') { fwrite($pipes[0], $pw . "\n", 1+strlen($pw)); usleep(1000); } + fwrite($pipes[0], $pw . "\n", 1+strlen($pw)); fclose($pipes[0]); @@ -1037,8 +1038,8 @@ function _pacrypt_dovecot($pw, $pw_db = '') { // Read hash from pipe stdout $password = fread($pipes[1], 200); - if (empty($password)) { - error_log("Failed to read password from $dovecotpw ... stderr: $stderr_output "); + if (!empty($stderr_output) || empty($password)) { + error_log("Failed to read password from $dovecotpw ... stderr: $stderr_output, password: $password "); throw new Exception("$dovecotpw failed, see error log for details"); } From 89aebea61ded931a5510193e1fbc4254b24a8255 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 6 Aug 2020 20:28:20 +0100 Subject: [PATCH 051/691] Revert "Disallow aliases that point to themselves (fixes postfixadmin/postfixadmin/issues/358)" This reverts commit c3d5b26740d2461f86a18f718bffc7db26cf49c5. --- model/AliasHandler.php | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/model/AliasHandler.php b/model/AliasHandler.php index 10117489..387e9b2c 100644 --- a/model/AliasHandler.php +++ b/model/AliasHandler.php @@ -390,41 +390,16 @@ class AliasHandler extends PFAHandler { # Note: alias domains are better, but we should keep this way supported for backward compatibility # and because alias domains can't forward to external domains list(/*NULL*/, $domain) = explode('@', $singlegoto); - $domain_check = check_domain($domain); if ($domain_check != '') { $errors[] = "$singlegoto: $domain_check"; } - - $localaliasonly_check = check_localaliasonly($domain); - if ($localaliasonly_check != '') { - $errors[] = "$singlegoto: $localaliasonly_check"; - } - - if($this->called_by != "MailboxHandler" && $this->id == $singlegoto) { - // The MailboxHandler needs to create an alias that is points to itself (for the mailbox) - // Otherwise, disallow such aliases as they cause severe trouble in the mail system - $errors[] = "$singlegoto: Alias may not point to itself"; - } - } else { $email_check = check_email($singlegoto); // preg_match -> allows for redirect to a local system account. if ($email_check != '' && !preg_match('/^[a-z0-9]+$/', $singlegoto)) { $errors[] = "$singlegoto: $email_check"; } - - $localaliasonly_check = check_localaliasonly($singlegoto); - if ($localaliasonly_check != '') { - $errors[] = "$singlegoto: $localaliasonly_check"; - } - - if($this->called_by != "MailboxHandler" && $this->id == $singlegoto) { - // The MailboxHandler needs to create an alias that is points to itself (for the mailbox) - // Otherwise, disallow such aliases as they cause severe trouble in the mail system - $errors[] = "$singlegoto: Alias may not point to itself"; - } - } } From b0aa0141d7995d0a2bd26edccf45c147d1480e3b Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 6 Aug 2020 20:43:47 +0100 Subject: [PATCH 052/691] reformat --- functions.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions.inc.php b/functions.inc.php index b153839a..f9fc0815 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -1040,7 +1040,7 @@ function _pacrypt_dovecot($pw, $pw_db = '') { if (!empty($stderr_output) || empty($password)) { error_log("Failed to read password from $dovecotpw ... stderr: $stderr_output, password: $password "); - throw new Exception("$dovecotpw failed, see error log for details"); + throw new Exception("$dovecotpw failed, see error log for details"); } if (empty($dovepasstest)) { From c3a8875ca6e2b50795fa82a7584a545b4f41d3eb Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 6 Aug 2020 21:10:30 +0100 Subject: [PATCH 053/691] psalm fixes --- model/PFAHandler.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/model/PFAHandler.php b/model/PFAHandler.php index 4e7a5a2a..9bf5dc42 100644 --- a/model/PFAHandler.php +++ b/model/PFAHandler.php @@ -546,16 +546,18 @@ abstract class PFAHandler { $db_values = $this->values; - foreach (array_keys($db_values) as $key) { + foreach ($db_values as $key => $val) { switch ($this->struct[$key]['type']) { # modify field content for some types case 'bool': - $db_values[$key] = db_get_boolean($db_values[$key]); + $val = (string) $val; + $db_values[$key] = db_get_boolean($val); break; case 'pass': - $db_values[$key] = pacrypt($db_values[$key]); + $val = (string) $val; + $db_values[$key] = pacrypt($val); break; case 'b64p': - $db_values[$key] = base64_encode($db_values[$key]); + $db_values[$key] = base64_encode($val); break; case 'quot': case 'vnum': From fe3e9e2702c18529989d7c71b8ead211837bf08e Mon Sep 17 00:00:00 2001 From: GermanCoding Date: Fri, 7 Aug 2020 22:15:45 +0200 Subject: [PATCH 054/691] Disallow alias that points to itself (fixes #358) Based on an older commit, but this time done right. This change prevents any user-defined aliases that point to themselves, because such aliases are not supported by Postfix and cause mail delivery errors. --- languages/bg.lang | 1 + languages/ca.lang | 1 + languages/cn.lang | 1 + languages/cs.lang | 1 + languages/da.lang | 1 + languages/de.lang | 1 + languages/en.lang | 1 + languages/es.lang | 1 + languages/et.lang | 1 + languages/eu.lang | 1 + languages/fi.lang | 1 + languages/fo.lang | 1 + languages/fr.lang | 1 + languages/gl.lang | 1 + languages/hr.lang | 1 + languages/hu.lang | 1 + languages/is.lang | 1 + languages/it.lang | 1 + languages/ja.lang | 1 + languages/lt.lang | 1 + languages/mk.lang | 1 + languages/nb.lang | 1 + languages/nl.lang | 1 + languages/nn.lang | 1 + languages/pl.lang | 1 + languages/pt-br.lang | 1 + languages/ro.lang | 1 + languages/ru.lang | 1 + languages/sk.lang | 1 + languages/sl.lang | 1 + languages/sv.lang | 1 + languages/tr.lang | 1 + languages/tw.lang | 1 + model/AliasHandler.php | 5 +++++ 34 files changed, 38 insertions(+) diff --git a/languages/bg.lang b/languages/bg.lang index f5710289..7a632129 100644 --- a/languages/bg.lang +++ b/languages/bg.lang @@ -127,6 +127,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'За да създадете catch-all използвайте "*" за alias. За пренасочване на домейн към домейн използвайте "*@domain.tld" в полето Към.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Редактиране на alias за вашия домейн.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Един запис на ред.'; # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/ca.lang b/languages/ca.lang index 6d29d175..1538e762 100644 --- a/languages/ca.lang +++ b/languages/ca.lang @@ -125,6 +125,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Per crear un àlies general usi "*" com a àlies. Per una redirecció de domini a domini, usi "*@domain.tld" com a Destí.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Editi un àlies pel seu domini.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Una entrada per línia.'; # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/cn.lang b/languages/cn.lang index 6adc6437..d2f6953f 100644 --- a/languages/cn.lang +++ b/languages/cn.lang @@ -126,6 +126,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = '要将所有的邮件全部转发请使用"*"作为别名. 域到域的转发请使用"*@domain.tld".'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = '编辑你域名中的别名.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = '每行一条记录.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/cs.lang b/languages/cs.lang index 7d279b65..6e60a9ad 100644 --- a/languages/cs.lang +++ b/languages/cs.lang @@ -134,6 +134,7 @@ $PALANG['alias_updated'] = 'Přesměrování %s bylo upraveno!'; $PALANG['pCreate_alias_catchall_text'] = 'Pro vytvoření doménového koše použijte * jako alias. Pro přesměrování doména -> doména použijte *@domain.tld jako cíl.'; $PALANG['mailbox_alias_cant_be_deleted'] = 'Toto přesměrování je svázáno s emailem a nemůže být proto vymazáno!'; $PALANG['protected_alias_cant_be_deleted'] = 'Tento alias %s je chráněný a může být odstraněn pouze superadministrátorem'; +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Upravit nastavení přesměrování.'; $PALANG['pEdit_alias_help'] = 'Je možné zadat více cílových adres, jeden záznam na řádek.'; diff --git a/languages/da.lang b/languages/da.lang index 73d3ce4e..2ffb8f29 100644 --- a/languages/da.lang +++ b/languages/da.lang @@ -131,6 +131,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'For at tilføje et stjerne-alias, brug en "*" som alias. For domæne til domæne-videresending brug "*@domæne.tld" som modtager.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Rediger alias.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'En modtager pr. linje.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/de.lang b/languages/de.lang index 8fc2bd17..60eb9611 100644 --- a/languages/de.lang +++ b/languages/de.lang @@ -128,6 +128,7 @@ $PALANG['alias_updated'] = 'Der Alias %s wurde geändert.'; $PALANG['pCreate_alias_catchall_text'] = 'Um alle Adressen abzudecken benutzen Sie einen "*" als Alias. Um ganze Domains an andere Domains weiterzuleiten benutzen Sie "*@domain.tld" im "An"-Feld.'; $PALANG['mailbox_alias_cant_be_deleted'] = 'Dieser Alias gehört zu einer Mailbox und kann nicht gelöscht werden!'; $PALANG['protected_alias_cant_be_deleted'] = 'Der Alias %s ist geschützt und kann nur von einem Superadmin gelöscht werden.'; +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Weiterleitungs-Einstellungen ändern'; $PALANG['pEdit_alias_help'] = 'Angabe mehrerer Ziele möglich, ein Eintrag pro Zeile.'; diff --git a/languages/en.lang b/languages/en.lang index addbd846..4cddf274 100644 --- a/languages/en.lang +++ b/languages/en.lang @@ -129,6 +129,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; $PALANG['pCreate_alias_catchall_text'] = 'To create a catch-all use an "*" as alias.'; # XXX don't propagate usage of *@target-domain.com for domain-aliasing any longer $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; $PALANG['pEdit_alias_welcome'] = 'Edit forwarding settings'; $PALANG['pEdit_alias_help'] = 'Accepts multiple targets, one entry per line.'; diff --git a/languages/es.lang b/languages/es.lang index b5b87803..315088b7 100644 --- a/languages/es.lang +++ b/languages/es.lang @@ -126,6 +126,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Para crear un alias general use "*" como alias. Para una redirección de dominio a dominio, use "*@domain.tld" como Destino.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Edite un alias para su dominio.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Una entrada por línea.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/et.lang b/languages/et.lang index 21259c1c..7febdad7 100644 --- a/languages/et.lang +++ b/languages/et.lang @@ -126,6 +126,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Loomaks püüa-kõik aadressi kasuta aliasena "*". Domeenilt domeenile edasisaatmiseks kasuta kellele väljal "*@domeen.xx".'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Muuda aliast.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Üks kirje rea kohta.'; # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/eu.lang b/languages/eu.lang index 038d0ea7..3303690e 100644 --- a/languages/eu.lang +++ b/languages/eu.lang @@ -124,6 +124,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Alias orokor bat sortzeko "*" erabil ezazu alias gisa. Domeinuz domeinurako birbideraketa baterako Norako gisa "*@domain.tld" erabil ezazu.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Domeinuarentzat aliasa aldatu.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Lerroko sarrera bat.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/fi.lang b/languages/fi.lang index 4e73cea6..4f31b265 100644 --- a/languages/fi.lang +++ b/languages/fi.lang @@ -127,6 +127,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Jos haluat luoda catch-all osoitteen käytä "*" merkkiä aliaksena. Ohjaus domainista domainiin tapahtuu käyttämällä "*@domain.tld" Kenelle: -osoitteena.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Muokkaa aliasta.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Yksi kohta per rivi.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' $PALANG['alias'] = 'Alias'; diff --git a/languages/fo.lang b/languages/fo.lang index f0a7b3f0..5d4a1b5c 100644 --- a/languages/fo.lang +++ b/languages/fo.lang @@ -126,6 +126,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Fyri at stovna eitt ið fangar alt, brúka eina "*" sum dulnevni. Fyri navnaøki til navnaøki víðarisending brúka "*@navnaøki.fo" til hetta.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Broyt eitt dulnevni á tínum navnaøki.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Eina adressu pr. linju.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/fr.lang b/languages/fr.lang index f8a5f728..e746c9b0 100644 --- a/languages/fr.lang +++ b/languages/fr.lang @@ -129,6 +129,7 @@ $PALANG['alias_updated'] = 'L\'alias %s a été mis à jour !'; $PALANG['pCreate_alias_catchall_text'] = 'Pour ajouter un alias global, utilisez "*". Pour un transfert de domaine à domaine, utilisez "*@domain.tld" dans le champ À.'; $PALANG['mailbox_alias_cant_be_deleted'] = 'Cet alias appartient à un compte courriel et ne peut donc pas être supprimé !'; $PALANG['protected_alias_cant_be_deleted'] = 'L\'alias %s est protégé et ne peut être supprimé que par un Super Administrateur.'; +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Modifier les paramètres de transfert.'; $PALANG['pEdit_alias_help'] = 'Destinataires multiples acceptés, une entrée par ligne.'; diff --git a/languages/gl.lang b/languages/gl.lang index 1864488e..6897488a 100644 --- a/languages/gl.lang +++ b/languages/gl.lang @@ -124,6 +124,7 @@ $PALANG['alias_updated'] = 'O alias %s foi actualizado!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Para crear un alias xeral use "*" como alias. Para unha redirección de dominio a dominio, use "*@domain.tld" como Destino.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'Este alias pertence a un buzón e non pode borrarse!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'O alias %s está protexido e só pode ser borrado por un superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Edite un alias para o seu dominio.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Unha entrada por liña.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/hr.lang b/languages/hr.lang index 8da0801c..74d07f68 100644 --- a/languages/hr.lang +++ b/languages/hr.lang @@ -125,6 +125,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Ukoliko želite stvoriti "sveprimajući" alias, upotrijebite "*" umjesto aliasa. Za preusmjeravanje iz domene na domenu, upotrijebite "*@domena.tld" u "Za" polju.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Uredi alias za domenu.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Jedan unos po liniji.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/hu.lang b/languages/hu.lang index 6bc04190..1401cf3f 100644 --- a/languages/hu.lang +++ b/languages/hu.lang @@ -128,6 +128,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'A catch-all (*@valami.hu) beállításához használj "*" -ot az alias mezõnél. A domain-domain közötti átirányításhoz használd a "*@akarmi.hu" címet.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Alias szerkesztése a domainhez.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Soronként egy.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/is.lang b/languages/is.lang index 278ea439..d609a4f9 100644 --- a/languages/is.lang +++ b/languages/is.lang @@ -126,6 +126,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Til að útbúa alias fyrir öll netföng í léninu, þá geturðu útbúið "*" alias. Til að áframsenda með alias á annað lén eða pósthólf, notaðu "*@domain.tld í til.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Breyta alias í léninu.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Ein færsla í einu.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/it.lang b/languages/it.lang index f23f5f9e..6f1e0586 100644 --- a/languages/it.lang +++ b/languages/it.lang @@ -127,6 +127,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Per creare un account universale, usare "*" come alias. Per inoltri da dominio a dominio, usare "*@domain.tld" come campo "a".'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Modifica un alias per il tuo dominio.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Un indirizzo per linea.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/ja.lang b/languages/ja.lang index 6412831b..55af9968 100644 --- a/languages/ja.lang +++ b/languages/ja.lang @@ -128,6 +128,7 @@ $PALANG['alias_updated'] = '転送先 %s を更新しました!'; $PALANG['pCreate_alias_catchall_text'] = 'すべてのメールを受け取るには、転送元に "*" を使います。 別のドメインにすべて転送するには、転送先に "*.domain.tld" を使います。'; $PALANG['mailbox_alias_cant_be_deleted'] = 'この転送先は、メールアドレスに紐付いているので、削除することはできません!'; $PALANG['protected_alias_cant_be_deleted'] = '転送先 %s は保護されており、特権管理者だけが削除できます'; +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = '転送先設定の編集'; $PALANG['pEdit_alias_help'] = '複数の転送先を設定できます。1行に1エントリです。'; diff --git a/languages/lt.lang b/languages/lt.lang index 17838776..c4256c74 100644 --- a/languages/lt.lang +++ b/languages/lt.lang @@ -126,6 +126,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Jei norite sukurti sinonimą, kuris gautų visas žinutes neegzistuojantiems adresatams, naudokite "*".'; $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Keisti persiuntimo nustatymus'; diff --git a/languages/mk.lang b/languages/mk.lang index 13aa046a..bfa8828f 100644 --- a/languages/mk.lang +++ b/languages/mk.lang @@ -126,6 +126,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'За да креираш catch-all користи "*" како алијас. За препраќање од домен на домен користи "*@domain.tld" како ДО.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Едитирање на алијас за вашиот домен.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Еден запис по линија.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/nb.lang b/languages/nb.lang index eb09db21..ed48daf1 100644 --- a/languages/nb.lang +++ b/languages/nb.lang @@ -128,6 +128,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'For å opprette et "catch-all"-alias, bruk "*" som alias. For domene-til-domene-videresending, bruk "*@domene.tld" i Til-feltet.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Endre et alias.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Én e-postadresse per linje.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' $PALANG['alias'] = 'Alias'; diff --git a/languages/nl.lang b/languages/nl.lang index fdc1b67d..90146e22 100644 --- a/languages/nl.lang +++ b/languages/nl.lang @@ -128,6 +128,7 @@ $PALANG['alias_updated'] = 'De alias %s is bijgewerkt!'; $PALANG['pCreate_alias_catchall_text'] = 'Om een catch-all te gebruiken, dient u een "*" (asteric) in te vullen als alias. Voor domein naar domein forwarding gebruik "*@domein.tld" als naar.'; $PALANG['mailbox_alias_cant_be_deleted'] = 'De alias maakt onderdeel uit van mailbox en kan niet worden verwijderd!'; $PALANG['protected_alias_cant_be_deleted'] = 'De alias %s is beschermd en kan alleen worden verwijderd door een superadministrator'; +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Bewerk een alias voor uw domein.'; $PALANG['pEdit_alias_help'] = 'Meerdere e-mailadressen toegestaan. Slechts één alias per regel.'; diff --git a/languages/nn.lang b/languages/nn.lang index e6169db8..a5bc7dc4 100644 --- a/languages/nn.lang +++ b/languages/nn.lang @@ -126,6 +126,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'For å opprette et alias som "mottar alt" bruk "*" som alias. For domene-til-domene videresending bruk "*@domene.tld" som mottaker.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Endre et alias.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'En mottaker per linje.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' $PALANG['alias'] = 'Alias'; diff --git a/languages/pl.lang b/languages/pl.lang index df717ea6..15b9601d 100644 --- a/languages/pl.lang +++ b/languages/pl.lang @@ -129,6 +129,7 @@ $PALANG['alias_updated'] = 'Alias %s został zaktualizowany!'; $PALANG['pCreate_alias_catchall_text'] = 'Aby utworzyć domyślne konto dla domeny (catch-all) podaj "*" (gwiazdkę) jako alias. Jeśli chcesz przekazywać całość poczty do innej domeny, wpisz jako alias "*@domena.tld".'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Edytuj alias dla Twojej domeny.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Jeden wpis na linię.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' $PALANG['alias'] = 'Alias'; diff --git a/languages/pt-br.lang b/languages/pt-br.lang index a4e506e0..8b5cb4cf 100644 --- a/languages/pt-br.lang +++ b/languages/pt-br.lang @@ -130,6 +130,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Para criar um alias global, use "*" no campo Alias. Para encaminhar de um domínio para outro, use "*@dominio.tld" no campo Para.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Edição de alias do domínio.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Uma entrada por linha.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/ro.lang b/languages/ro.lang index 984633a0..8f2d8b16 100644 --- a/languages/ro.lang +++ b/languages/ro.lang @@ -128,6 +128,7 @@ $PALANG['alias_updated'] = 'Aliasul %s a fost modificat!'; $PALANG['pCreate_alias_catchall_text'] = 'Puteti crea un alias pentru adrese multiple prin folosirea "*".'; # XXX don't propagate usage of *@target-domain.com for domain-aliasing any longer $PALANG['mailbox_alias_cant_be_deleted'] = 'Acest alias apartine unei casute si nu poate fi sters!'; $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Editeaza setarile de redirectionare'; $PALANG['pEdit_alias_help'] = 'Se accepta inregistrari multiple, cate una pe linie.'; diff --git a/languages/ru.lang b/languages/ru.lang index f2240cec..2773e7d2 100644 --- a/languages/ru.lang +++ b/languages/ru.lang @@ -131,6 +131,7 @@ $PALANG['alias_updated'] = 'Алиас %s успешно обновлен!'; $PALANG['pCreate_alias_catchall_text'] = 'Для создания catch-all почтового ящика используйте "*" в качестве имени алиаса.'; # XXX don't propagate usage of *@target-domain.com for domain-aliasing any longer $PALANG['mailbox_alias_cant_be_deleted'] = 'Указанный алиас ссылается на почтовый ящик и не может быть удален!'; $PALANG['protected_alias_cant_be_deleted'] = 'Алиас %s защищен и может быть удален только суперадмином'; +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Редактирование настроек пересылки'; $PALANG['pEdit_alias_help'] = 'Можно указать несколько целей, по одной записи на строку.'; diff --git a/languages/sk.lang b/languages/sk.lang index 430e9ee7..e5a522f9 100644 --- a/languages/sk.lang +++ b/languages/sk.lang @@ -127,6 +127,7 @@ $PALANG['alias_updated'] = 'Alias %s bol aktualizovaný.'; $PALANG['pCreate_alias_catchall_text'] = 'Pre vytvorenie doménového koša použite * ako alias. Pre alias doména-doména použite *@domain.tld ako cieľ.'; $PALANG['mailbox_alias_cant_be_deleted'] = 'Tento alias patrí k schránke a nemôže byť zmazaný!'; $PALANG['protected_alias_cant_be_deleted'] = 'Alias %s je chránený a môže ho zmazať len superadmin'; +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Upraviť alias'; $PALANG['pEdit_alias_help'] = 'Jeden záznam na riadok.'; diff --git a/languages/sl.lang b/languages/sl.lang index 659c1c78..73e12ec2 100644 --- a/languages/sl.lang +++ b/languages/sl.lang @@ -126,6 +126,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = 'Če želite ustvariti "vseobsegajoči" alias, uporabite "*" namesto aliasa. Za posredovanje iz domene na domeno, uporabite "*@domena.si" v "Za" polju.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Uredi alias za določeno domeno.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'V posamezni vrstici je lahko samo en naslov.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/sv.lang b/languages/sv.lang index b71d717e..a01514d7 100644 --- a/languages/sv.lang +++ b/languages/sv.lang @@ -129,6 +129,7 @@ $PALANG['alias_updated'] = 'Aliaset %s är uppdaterat!'; $PALANG['pCreate_alias_catchall_text'] = 'För att skapa en catch-all anges ett "*" som alias.'; $PALANG['mailbox_alias_cant_be_deleted'] = 'Detta alias tillhör en brevlåda och kan inte tas bort!'; $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Inställningar för vidarebefordring.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Ett alias per rad.'; # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/tr.lang b/languages/tr.lang index 29c146c8..bcdd0741 100644 --- a/languages/tr.lang +++ b/languages/tr.lang @@ -126,6 +126,7 @@ $PALANG['alias_updated'] = '%s aliasınız güncellendi!'; $PALANG['pCreate_alias_catchall_text'] = 'Tümünü-yakala oluşturmak için alias olarak "*" kullanın. Domain yönlendirme domaini için kime kısmında "*@domain.tld" kullanın.'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'Bu alias, sistemde kayıtlı bir e-posta hesabına ait ve silinemez!'; $PALANG['protected_alias_cant_be_deleted'] = '%s isimli alias korumalı olarak ayarlı ve ancak bir süper yönetici tarafından silinebilir'; +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = 'Yönlendirme ayarlarını düzenleyin. '; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = 'Her bir satıra bir giriş şeklinde, çoklu hedefler kabul edilir.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/languages/tw.lang b/languages/tw.lang index 6fdff720..9493ab35 100644 --- a/languages/tw.lang +++ b/languages/tw.lang @@ -127,6 +127,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX $PALANG['pCreate_alias_catchall_text'] = '要將所有的郵件全部轉發請使用"*"作為別名. 網域到網域的轉發請使用"*@domain.tld".'; # XXX check/beautify - was split in two lines before $PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX $PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX +$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX $PALANG['pEdit_alias_welcome'] = '編輯你網域中的別名.'; # XXX Text change to: 'Edit forwarding settings' $PALANG['pEdit_alias_help'] = '每行一條記錄.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.' diff --git a/model/AliasHandler.php b/model/AliasHandler.php index 387e9b2c..8fd40ede 100644 --- a/model/AliasHandler.php +++ b/model/AliasHandler.php @@ -401,6 +401,11 @@ class AliasHandler extends PFAHandler { $errors[] = "$singlegoto: $email_check"; } } + if($this->called_by != "MailboxHandler" && $this->id == $singlegoto) { + // The MailboxHandler needs to create an alias that points to itself (for the mailbox) + // Otherwise, disallow such aliases as they cause severe trouble in the mail system + $errors[] = "$singlegoto: " . Config::Lang('alias_points_to_itself'); + } } if (count($errors)) { From b1ccb2b07bf470057532bb4b421687f0b4da6c48 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 13 Aug 2020 14:47:00 +0100 Subject: [PATCH 055/691] merge in socket support for postgresql connections - see https://github.com/postfixadmin/postfixadmin/issues/370 --- functions.inc.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/functions.inc.php b/functions.inc.php index f9fc0815..f6dd78aa 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -1601,10 +1601,14 @@ function db_connect() { $dsn = "sqlite:{$db}"; $username_password = false; } elseif (db_pgsql()) { - if (!isset($CONF['database_port'])) { - $CONF['database_port'] = '5432'; + $dsn = "pgsql:dbname={$CONF['database_name']}"; + if (isset($CONF['database_host'])) { + $dsn .= ";host={$CONF['database_host']}"; } - $dsn = "pgsql:host={$CONF['database_host']};port={$CONF['database_port']};dbname={$CONF['database_name']};options='-c client_encoding=utf8'"; + if (isset($CONF['database_port'])) { + $dsn .= ";port={$CONF['database_port']}"; + } + $dsn .= ";options='-c client_encoding=utf8'"; } else { throw new Exception("

    FATAL Error:
    Invalid \$CONF['database_type']! Please fix your config.inc.php!

    "); } From 5bd5bdc25b3a2917100eba45597f434dfbf74f56 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 13 Aug 2020 15:00:22 +0100 Subject: [PATCH 056/691] merge https://github.com/postfixadmin/postfixadmin/pull/375 add unit test --- model/AliasHandler.php | 2 +- tests/AdminHandlerTest.php | 2 + tests/AliasHandlerTest.php | 102 +++++++++++++++++++++++++++++++++++-- 3 files changed, 100 insertions(+), 6 deletions(-) diff --git a/model/AliasHandler.php b/model/AliasHandler.php index 8fd40ede..f680a994 100644 --- a/model/AliasHandler.php +++ b/model/AliasHandler.php @@ -21,7 +21,7 @@ class AliasHandler extends PFAHandler { # (for existing aliases, init() hides it for non-mailbox aliases) $mbgoto = 1 - $this->new; - $this->struct=array( + $this->struct = array( # field name allow display in... type $PALANG label $PALANG description default / ... # editing? form list 'status' => pacol(0, 0, 0, 'html', '' , '' , '', array(), diff --git a/tests/AdminHandlerTest.php b/tests/AdminHandlerTest.php index c13f9502..5843aa9d 100644 --- a/tests/AdminHandlerTest.php +++ b/tests/AdminHandlerTest.php @@ -12,6 +12,8 @@ class AdminHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertEmpty($results); } + + } /* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */ diff --git a/tests/AliasHandlerTest.php b/tests/AliasHandlerTest.php index dcf3382d..55b70ba9 100644 --- a/tests/AliasHandlerTest.php +++ b/tests/AliasHandlerTest.php @@ -1,7 +1,9 @@ getList(""); $this->assertTrue($list); @@ -9,7 +11,8 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertEmpty($results); } - public function tearDown() : void { + public function tearDown(): void + { $_SESSION = []; db_query('DELETE FROM alias'); db_query('DELETE FROM domain_admins'); @@ -18,7 +21,8 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { parent::tearDown(); } - public function testCannotAddAliasUntilDomainIsThere() { + public function testCannotAddAliasUntilDomainIsThere() + { // Fake us being an admin. @@ -49,7 +53,95 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { } - public function testAddingDataEtc() { + /** + * @see https://github.com/postfixadmin/postfixadmin/pull/375 and https://github.com/postfixadmin/postfixadmin/issues/358 + */ + public function testCannotAddAliasThatPointsToItself() + { + // Fake being an admin. + $_SESSION = [ + 'sessid' => [ + 'roles' => ['global-admin'] + ] + ]; + // Add example.com + $dh = new DomainHandler(1, 'admin', true); + + $dh->init('example.com'); + + $ret = $dh->set( + [ + 'domain' => 'example.com', + 'description' => 'test domain', + 'aliases' => 11, + 'mailboxes' => 12, + 'active' => 1, + 'backupmx' => 0, + 'default_aliases' => 1 + ] + ); + + + $this->assertEmpty($dh->errormsg); + $this->assertEmpty($dh->infomsg); + + $this->assertTrue($ret); + + $ret = $dh->store(); + + $this->assertTrue($ret); + + // Need to add 'admin' as a domain_admin + db_insert('domain_admins', ['username' => 'admin', 'domain' => 'example.com', 'created' => '2020-01-01', 'active' => 1], ['created'], true); + + $dh = new DomainHandler(0, 'admin', true); + $dh->getList(''); + $result = $dh->result(); + + $this->assertEmpty($dh->infomsg); + $this->assertEmpty($dh->errormsg); + + $this->assertNotEmpty($result); + + $this->assertEquals('example.com', $result['example.com']['domain']); + $this->assertEquals('test domain', $result['example.com']['description']); + + $this->assertEquals(11, $result['example.com']['aliases']); + $this->assertEquals(12, $result['example.com']['mailboxes']); // default aliases. + + $this->assertEquals(4, $result['example.com']['alias_count']); // default aliases. + $this->assertEquals(0, $result['example.com']['mailbox_count']); + $this->assertEquals(1, $result['example.com']['active']); + + $x = new AliasHandler(1, 'admin', true); + + $values = [ + 'localpart' => 'david.test', + 'domain' => 'example.com', + 'active' => 1, + 'address' => 'david.test@example.com', + 'goto' => ['david.test@example.com'] + ]; + + $r = $x->init('david.test@example.com'); + $this->assertTrue($r); + $x->getList(''); + $list = $x->result(); + $this->assertEquals(4, count($list)); // default aliases. + + $x->set($values); + $x->store(); + + $this->assertNotEmpty($x->errormsg); + $this->assertEquals( + [ + 'goto' => "david.test@example.com: Alias may not point to itself", + 0 => "one or more values are invalid!" + ], $x->errormsg); + } + + public function testAddingDataEtc() + { // Fake being an admin. $_SESSION = [ 'sessid' => [ From 12f68a6e3ae363d1d8ae31bdc056bb768b1c25e9 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 13 Aug 2020 15:27:47 +0100 Subject: [PATCH 057/691] composer format time --- model/AliasHandler.php | 2 +- tests/AdminHandlerTest.php | 2 -- tests/AliasHandlerTest.php | 18 ++++++------------ 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/model/AliasHandler.php b/model/AliasHandler.php index f680a994..9119cfdd 100644 --- a/model/AliasHandler.php +++ b/model/AliasHandler.php @@ -401,7 +401,7 @@ class AliasHandler extends PFAHandler { $errors[] = "$singlegoto: $email_check"; } } - if($this->called_by != "MailboxHandler" && $this->id == $singlegoto) { + if ($this->called_by != "MailboxHandler" && $this->id == $singlegoto) { // The MailboxHandler needs to create an alias that points to itself (for the mailbox) // Otherwise, disallow such aliases as they cause severe trouble in the mail system $errors[] = "$singlegoto: " . Config::Lang('alias_points_to_itself'); diff --git a/tests/AdminHandlerTest.php b/tests/AdminHandlerTest.php index 5843aa9d..c13f9502 100644 --- a/tests/AdminHandlerTest.php +++ b/tests/AdminHandlerTest.php @@ -12,8 +12,6 @@ class AdminHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertEmpty($results); } - - } /* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */ diff --git a/tests/AliasHandlerTest.php b/tests/AliasHandlerTest.php index 55b70ba9..d75a7922 100644 --- a/tests/AliasHandlerTest.php +++ b/tests/AliasHandlerTest.php @@ -1,9 +1,7 @@ getList(""); $this->assertTrue($list); @@ -11,8 +9,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase $this->assertEmpty($results); } - public function tearDown(): void - { + public function tearDown(): void { $_SESSION = []; db_query('DELETE FROM alias'); db_query('DELETE FROM domain_admins'); @@ -21,8 +18,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase parent::tearDown(); } - public function testCannotAddAliasUntilDomainIsThere() - { + public function testCannotAddAliasUntilDomainIsThere() { // Fake us being an admin. @@ -56,8 +52,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase /** * @see https://github.com/postfixadmin/postfixadmin/pull/375 and https://github.com/postfixadmin/postfixadmin/issues/358 */ - public function testCannotAddAliasThatPointsToItself() - { + public function testCannotAddAliasThatPointsToItself() { // Fake being an admin. $_SESSION = [ 'sessid' => [ @@ -140,8 +135,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase ], $x->errormsg); } - public function testAddingDataEtc() - { + public function testAddingDataEtc() { // Fake being an admin. $_SESSION = [ 'sessid' => [ From 4d8b4558d7ce9831446b0da86f724d69a5175016 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 13 Aug 2020 16:59:40 +0100 Subject: [PATCH 058/691] might fix: https://github.com/postfixadmin/postfixadmin/issues/378 --- functions.inc.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/functions.inc.php b/functions.inc.php index f6dd78aa..e1400bff 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -1017,6 +1017,9 @@ function _pacrypt_dovecot($pw, $pw_db = '') { # only use -t for salted passwords to be backward compatible with dovecot < 2.1 $dovepasstest = " -t " . escapeshellarg($pw_db); } + + $pipes = []; + $pipe = proc_open("$dovecotpw '-s' $method$dovepasstest", $spec, $pipes); if (!$pipe) { From 3d46ec795969f76604a8ed522df130548ae428c2 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 12 Sep 2020 21:04:18 +0100 Subject: [PATCH 059/691] revert: 1d1960a47687490b2b1450fc1dc543a587369802 - see https://github.com/postfixadmin/postfixadmin/issues/384 --- model/MailboxHandler.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/model/MailboxHandler.php b/model/MailboxHandler.php index 8a0f34f7..85d0c9b4 100644 --- a/model/MailboxHandler.php +++ b/model/MailboxHandler.php @@ -18,9 +18,8 @@ class MailboxHandler extends PFAHandler { $reset_by_sms = 1; } - $show_password_fields = (int) !Config::bool('generate_password'); - $this->struct = array( + # field name allow display in... type $PALANG label $PALANG description default / options / ... # editing? form list 'username' => pacol($this->new, 1, 1, 'mail', 'pEdit_mailbox_username' , '' , '' ), @@ -30,8 +29,8 @@ class MailboxHandler extends PFAHandler { # TODO: maildir: display in list is needed to include maildir in SQL result (for post_edit hook) # TODO: (not a perfect solution, but works for now - maybe we need a separate "include in SELECT query" field?) 'maildir' => pacol($this->new, 0, 1, 'text', '' , '' , '' ), - 'password' => pacol(1, $show_password_fields, 0, 'pass', 'password' , 'pCreate_mailbox_password_text' , '' ), - 'password2' => pacol(1, $show_password_fields, 0, 'pass', 'password_again' , '' , '', + 'password' => pacol(1, 1, 0, 'pass', 'password' , 'pCreate_mailbox_password_text' , '' ), + 'password2' => pacol(1, 1, 0, 'pass', 'password_again' , '' , '', /*options*/ array(), /*not_in_db*/ 0, /*dont_write_to_db*/ 1, From 8658ed7083b4d590fbc8ff9d7131b33f591876be Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Wed, 23 Sep 2020 11:45:02 +0100 Subject: [PATCH 060/691] Update Postfix-Dovecot-Postgresql-Example.md typo fix via Raul (emailed). --- DOCUMENTS/Postfix-Dovecot-Postgresql-Example.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DOCUMENTS/Postfix-Dovecot-Postgresql-Example.md b/DOCUMENTS/Postfix-Dovecot-Postgresql-Example.md index e5773972..f69fbc28 100644 --- a/DOCUMENTS/Postfix-Dovecot-Postgresql-Example.md +++ b/DOCUMENTS/Postfix-Dovecot-Postgresql-Example.md @@ -217,5 +217,5 @@ default_pass_scheme = MD5-CRYPT password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1' # Query to retrieve user information, note uid matches dovecot.conf AND Postfix virtual_uid_maps parameter. -user_query = SELECT '/var/vmail/mail/' || maildir AS home, 8 as uid, 8 as gid FROM mailbox WHERE username = '%u' AND active = '1' +user_query = SELECT '/var/mail/mail/' || maildir AS home, 8 as uid, 8 as gid FROM mailbox WHERE username = '%u' AND active = '1' ``` From 07805ec6c634537c3b9f387c74055a818bf9ade8 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Wed, 23 Sep 2020 11:55:57 +0100 Subject: [PATCH 061/691] Update Postfix-Dovecot-Postgresql-Example.md v v v v v vmail ..... --- DOCUMENTS/Postfix-Dovecot-Postgresql-Example.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DOCUMENTS/Postfix-Dovecot-Postgresql-Example.md b/DOCUMENTS/Postfix-Dovecot-Postgresql-Example.md index f69fbc28..7d41296a 100644 --- a/DOCUMENTS/Postfix-Dovecot-Postgresql-Example.md +++ b/DOCUMENTS/Postfix-Dovecot-Postgresql-Example.md @@ -217,5 +217,5 @@ default_pass_scheme = MD5-CRYPT password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1' # Query to retrieve user information, note uid matches dovecot.conf AND Postfix virtual_uid_maps parameter. -user_query = SELECT '/var/mail/mail/' || maildir AS home, 8 as uid, 8 as gid FROM mailbox WHERE username = '%u' AND active = '1' +user_query = SELECT '/var/mail/vmail/' || maildir AS home, 8 as uid, 8 as gid FROM mailbox WHERE username = '%u' AND active = '1' ``` From 10c92da8c87d8b50a3a373f393f3427aa732f0d1 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 24 Sep 2020 22:32:19 +0100 Subject: [PATCH 062/691] improve domain handler test --- tests/DomainHandlerTest.php | 96 ++++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 2 deletions(-) diff --git a/tests/DomainHandlerTest.php b/tests/DomainHandlerTest.php index 80042acb..91145611 100644 --- a/tests/DomainHandlerTest.php +++ b/tests/DomainHandlerTest.php @@ -1,7 +1,9 @@ getList(""); @@ -12,4 +14,94 @@ class DomainHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertEmpty($results); } + + public function testAddAndUpdate() + { + // Fake being an admin. + $_SESSION = [ + 'sessid' => [ + 'roles' => ['global-admin'] + ] + ]; + // Add example.com + $username = 'admin'; + $domain = 'example.com'; + + + $dh = new DomainHandler(1, $username, true); + + $dh->init($domain); + + $ret = $dh->set( + [ + 'domain' => $domain, + 'description' => 'test domain', + 'aliases' => 11, + 'mailboxes' => 12, + 'active' => 1, + 'backupmx' => 0, + 'default_aliases' => 1 + ] + ); + + + $this->assertEmpty($dh->errormsg); + $this->assertEmpty($dh->infomsg); + $this->assertTrue($ret); + $ret = $dh->store(); + $this->assertTrue($ret); + + // Need to add 'admin' as a domain_admin + db_insert('domain_admins', ['username' => $username, 'domain' => $domain, 'created' => '2020-01-01', 'active' => 1], ['created'], true); + + $dh = new DomainHandler(0, $username, true); + $dh->getList(''); + $result = $dh->result(); + $this->assertEmpty($dh->infomsg); + $this->assertEmpty($dh->errormsg); + + $this->assertNotEmpty($result); + + $expected = [ + 'domain' => $domain, + 'description' => 'test domain', + 'aliases' => 11, + 'alias_count' => 4, + 'mailboxes' => 12, + 'mailbox_count' => 0, + 'backupmx' => 0, + 'active' => 1, + ]; + + foreach ($expected as $k => $v) { + $this->assertEquals($v, $result[$domain][$k]); + } + + // perform some token update + + $dh = new DomainHandler(0, 'admin', true); + $dh->init($domain); + + $ret = $dh->set( + [ + //'domain' => 'example.com', + 'aliases' => 99, + 'mailboxes' => 88, + 'backupmx' => 0, + 'active' => 1, + ] + ); + + $this->assertTrue($ret); + $this->assertTrue($dh->store()); + $this->assertEmpty($dh->errormsg); + + $dh->getList(''); + $d = $dh->result()[$domain]; + + $this->assertEquals(99, $d['aliases']); + $this->assertEquals(88, $d['mailboxes']); + + + } } From 3c7da4f3b8e1fa6836ef5238ee211316e9b59194 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Fri, 25 Sep 2020 21:29:45 +0100 Subject: [PATCH 063/691] Refactor some methods PFAHandler::store() -> PFAHandler::save(); PFAHandler::storemore() -> PFAHandler::postSave(); PFAHandler::beforestore() -> PFAHandler::preSave(); --- model/AdminHandler.php | 2 +- model/AdminpasswordHandler.php | 2 +- model/AliasHandler.php | 6 +- model/AliasdomainHandler.php | 2 +- model/DomainHandler.php | 4 +- model/MailboxHandler.php | 10 +- model/PFAHandler.php | 24 +-- model/VacationHandler.php | 2 +- public/setup.php | 2 +- public/users/edit-alias.php | 2 +- public/users/password-change.php | 2 +- public/xmlrpc.php | 2 +- tests/AliasHandlerTest.php | 293 ++++++++++++++++++++++++------- tests/DomainHandlerTest.php | 4 +- tests/MailboxHandlerTest.php | 6 +- 15 files changed, 268 insertions(+), 95 deletions(-) diff --git a/model/AdminHandler.php b/model/AdminHandler.php index 9f898d65..9a35294f 100644 --- a/model/AdminHandler.php +++ b/model/AdminHandler.php @@ -123,7 +123,7 @@ class AdminHandler extends PFAHandler { * called by $this->store() after storing $this->values in the database * can be used to update additional tables, call scripts etc. */ - protected function storemore() { + protected function postSave() : bool { # store list of allowed domains in the domain_admins table if (isset($this->values['domains'])) { if (is_array($this->values['domains'])) { diff --git a/model/AdminpasswordHandler.php b/model/AdminpasswordHandler.php index 3f03376d..5799e22e 100644 --- a/model/AdminpasswordHandler.php +++ b/model/AdminpasswordHandler.php @@ -35,7 +35,7 @@ class AdminpasswordHandler extends PFAHandler { ); } - public function init($id) { + public function init($id) :bool { # hardcode to logged in admin if ($this->admin_username == '') { die("No admin logged in"); diff --git a/model/AliasHandler.php b/model/AliasHandler.php index 9119cfdd..d1f69111 100644 --- a/model/AliasHandler.php +++ b/model/AliasHandler.php @@ -136,7 +136,7 @@ class AliasHandler extends PFAHandler { * AliasHandler needs some special handling in init() and therefore overloads the function. * It also calls parent::init() */ - public function init($id) { + public function init(string $id) : bool { $bits = explode('@', $id); if (sizeof($bits) == 2) { $local_part = $bits[0]; @@ -303,7 +303,7 @@ class AliasHandler extends PFAHandler { $this->values['goto'] = join(',', $values['goto']); } - protected function storemore() { + protected function postSave() : bool { # TODO: if alias belongs to a mailbox, update mailbox active status return true; } @@ -357,7 +357,7 @@ class AliasHandler extends PFAHandler { return array($condition, $searchmode); } - public function getList($condition, $searchmode = array(), $limit=-1, $offset=-1) { + public function getList($condition, $searchmode = array(), $limit=-1, $offset=-1) : bool { list($condition, $searchmode) = $this->condition_ignore_mailboxes($condition, $searchmode); $this->set_is_mailbox_extrafrom($condition, $searchmode); $result = parent::getList($condition, $searchmode, $limit, $offset); diff --git a/model/AliasdomainHandler.php b/model/AliasdomainHandler.php index e2f3cb81..5b419632 100644 --- a/model/AliasdomainHandler.php +++ b/model/AliasdomainHandler.php @@ -51,7 +51,7 @@ class AliasdomainHandler extends PFAHandler { } } - public function init($id) { + public function init($id) : bool { $success = parent::init($id); if ($success) { if (count($this->struct['alias_domain']['options']) == 0 && $this->new) { diff --git a/model/DomainHandler.php b/model/DomainHandler.php index c919c3b9..4bdc48ba 100644 --- a/model/DomainHandler.php +++ b/model/DomainHandler.php @@ -148,7 +148,7 @@ class DomainHandler extends PFAHandler { } - protected function beforestore() { + protected function preSave() : bool { # TODO: is this function superfluous? _can_edit should already cover this if ($this->is_superadmin) { return true; @@ -161,7 +161,7 @@ class DomainHandler extends PFAHandler { * called by $this->store() after storing $this->values in the database * can be used to update additional tables, call scripts etc. */ - protected function storemore() { + protected function postSave() : bool { if ($this->new && $this->values['default_aliases']) { foreach (Config::read_array('default_aliases') as $address=>$goto) { $address = $address . "@" . $this->id; diff --git a/model/MailboxHandler.php b/model/MailboxHandler.php index 85d0c9b4..596eccd4 100644 --- a/model/MailboxHandler.php +++ b/model/MailboxHandler.php @@ -60,7 +60,7 @@ class MailboxHandler extends PFAHandler { } } - public function init($id) { + public function init($id) : bool { if (!parent::init($id)) { return false; } @@ -217,7 +217,7 @@ class MailboxHandler extends PFAHandler { } - protected function beforestore() { + protected function preSave() : bool { if (isset($this->values['quota']) && $this->values['quota'] != -1 && is_numeric($this->values['quota'])) { $multiplier = Config::read_string('quota_multiplier'); if ($multiplier == 0 || !is_numeric($multiplier)) { // or empty string, or null, or false... @@ -256,7 +256,7 @@ class MailboxHandler extends PFAHandler { return false; } - if (!$ah->store()) { + if (!$ah->save()) { $this->errormsg[] = $ah->errormsg[0]; return false; } @@ -292,7 +292,7 @@ class MailboxHandler extends PFAHandler { return $ok && parent::set($values); } - protected function storemore() { + protected function postSave() : bool { if ($this->new) { if (!$this->mailbox_post_script()) { # return false; # TODO: should this be fatal? @@ -649,7 +649,7 @@ class MailboxHandler extends PFAHandler { /** - * Called by storemore() after a mailbox has been created. + * Called by postSave() after a mailbox has been created. * Immediately returns, unless configuration indicates * that one or more sub-folders should be created. * diff --git a/model/PFAHandler.php b/model/PFAHandler.php index 9bf5dc42..f763dde0 100644 --- a/model/PFAHandler.php +++ b/model/PFAHandler.php @@ -337,7 +337,7 @@ abstract class PFAHandler { * initialize with $id and check if it is valid * @param string $id */ - public function init($id) { + public function init(string $id) : bool { // postfix treats address lookups (aliases, mailboxes) as if they were lowercase. // MySQL is normally case insenstive, PostgreSQL is case sensitive. @@ -526,7 +526,7 @@ abstract class PFAHandler { } /** - * store $this->values in the database + * save $this->values to the database * * converts values based on $this->struct[*][type] (boolean, password encryption) * @@ -534,13 +534,13 @@ abstract class PFAHandler { * @return bool - true if all values were stored in the database, otherwise false * error messages (if any) are stored in $this->errormsg */ - public function store() { + public function save() : bool { if ($this->values_valid == false) { $this->errormsg[] = "one or more values are invalid!"; return false; } - if (!$this->beforestore()) { + if (!$this->preSave()) { return false; } @@ -584,9 +584,9 @@ abstract class PFAHandler { return false; } - $result = $this->storemore(); + $result = $this->postSave(); - # db_log() even if storemore() failed + # db_log() even if postSave() failed db_log($this->domain, $this->msg['logname'], $this->id); if ($result) { @@ -600,17 +600,17 @@ abstract class PFAHandler { /** * called by $this->store() before storing the values in the database - * @return bool - if false, store() will abort + * @return bool - if false, save() will abort */ - protected function beforestore() { + protected function preSave() : bool { return true; # do nothing, successfully ;-) } /** - * called by $this->store() after storing $this->values in the database + * called by $this->save() after storing $this->values in the database * can be used to update additional tables, call scripts etc. */ - protected function storemore() { + protected function postSave() : bool { return true; # do nothing, successfully ;-) } @@ -735,7 +735,7 @@ abstract class PFAHandler { * @param int $offset - number of first row to return * @return array - rows (as associative array, with the ID as key) */ - protected function read_from_db($condition, $searchmode = array(), $limit=-1, $offset=-1) { + protected function read_from_db($condition, $searchmode = array(), $limit=-1, $offset=-1) : array { $queryparts = $this->build_select_query($condition, $searchmode); $query = $queryparts['select_cols'] . $queryparts['from_where_order']; @@ -800,7 +800,7 @@ abstract class PFAHandler { * @return bool - always true, no need to check ;-) (if $result is not an array, getList die()s) * The data is stored in $this->result (as array of rows, each row is an associative array of column => value) */ - public function getList($condition, $searchmode = array(), $limit=-1, $offset=-1) { + public function getList($condition, $searchmode = array(), $limit=-1, $offset=-1) : bool { if (is_array($condition)) { $real_condition = array(); foreach ($condition as $key => $value) { diff --git a/model/VacationHandler.php b/model/VacationHandler.php index fcdc900d..1b5bce31 100644 --- a/model/VacationHandler.php +++ b/model/VacationHandler.php @@ -279,7 +279,7 @@ class VacationHandler extends PFAHandler { # TODO: supress logging in AliasHandler if called from VacationHandler (VacationHandler should log itsself) - if (!$handler->store()) { + if (!$handler->save()) { print_r($handler->errormsg); # TODO: error handling return false; } diff --git a/public/setup.php b/public/setup.php index a47a6be8..cd488dc1 100644 --- a/public/setup.php +++ b/public/setup.php @@ -458,7 +458,7 @@ function create_admin($values) { return array(1, "", $handler->errormsg); } - if (!$handler->store()) { + if (!$handler->save()) { return array(1, "", $handler->errormsg); } diff --git a/public/users/edit-alias.php b/public/users/edit-alias.php index ea4f4916..3d59e91d 100644 --- a/public/users/edit-alias.php +++ b/public/users/edit-alias.php @@ -121,7 +121,7 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { flash_error($errormsg[0]); } - $updated = $ah->store(); + $updated = $ah->save(); if ($updated) { header("Location: main.php"); diff --git a/public/users/password-change.php b/public/users/password-change.php index e54f8b64..2085da34 100644 --- a/public/users/password-change.php +++ b/public/users/password-change.php @@ -70,7 +70,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $values = $handler->result; $values['password'] = $fPassword; $values['password2'] = $fPassword2; - if ($handler->set($values) && $handler->store()) { + if ($handler->set($values) && $handler->save()) { flash_info(Config::lang_f('pPassword_result_success', $tUsername)); header('Location: main.php'); exit(0); diff --git a/public/xmlrpc.php b/public/xmlrpc.php index 95cc923a..035f240c 100644 --- a/public/xmlrpc.php +++ b/public/xmlrpc.php @@ -176,7 +176,7 @@ class AliasProxy { //error_log('ah->set failed' . print_r($values, true)); return false; } - $store = $ah->store(); + $store = $ah->save(); return $store; } diff --git a/tests/AliasHandlerTest.php b/tests/AliasHandlerTest.php index d75a7922..ce4a9c1e 100644 --- a/tests/AliasHandlerTest.php +++ b/tests/AliasHandlerTest.php @@ -1,15 +1,21 @@ getList(""); - $this->assertTrue($list); - $results = $x->result(); - $this->assertEmpty($results); +class AliasHandlerTest extends \PHPUnit\Framework\TestCase +{ + + protected function setUp(): void + { + // Fake being an admin. + $_SESSION = [ + 'sessid' => [ + 'roles' => ['global-admin'] + ] + ]; + parent::setUp(); } - public function tearDown(): void { + protected function tearDown(): void + { $_SESSION = []; db_query('DELETE FROM alias'); db_query('DELETE FROM domain_admins'); @@ -18,7 +24,18 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { parent::tearDown(); } - public function testCannotAddAliasUntilDomainIsThere() { + public function testBasic() + { + $x = new AliasHandler(); + $list = $x->getList(""); + $this->assertTrue($list); + $results = $x->result(); + $this->assertEmpty($results); + } + + + public function testCannotAddAliasUntilDomainIsThere() + { // Fake us being an admin. @@ -52,7 +69,8 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { /** * @see https://github.com/postfixadmin/postfixadmin/pull/375 and https://github.com/postfixadmin/postfixadmin/issues/358 */ - public function testCannotAddAliasThatPointsToItself() { + public function testCannotAddAliasThatPointsToItself() + { // Fake being an admin. $_SESSION = [ 'sessid' => [ @@ -82,7 +100,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertTrue($ret); - $ret = $dh->store(); + $ret = $dh->save(); $this->assertTrue($ret); @@ -125,7 +143,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertEquals(4, count($list)); // default aliases. $x->set($values); - $x->store(); + $x->save(); $this->assertNotEmpty($x->errormsg); $this->assertEquals( @@ -135,61 +153,18 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { ], $x->errormsg); } - public function testAddingDataEtc() { + public function testAddingDataEtc() + { + // Fake being an admin. $_SESSION = [ 'sessid' => [ 'roles' => ['global-admin'] ] ]; - // Add example.com - $dh = new DomainHandler(1, 'admin', true); - $dh->init('example.com'); + $this->addDomain('example.com', 'admin'); - $ret = $dh->set( - [ - 'domain' => 'example.com', - 'description' => 'test domain', - 'aliases' => 11, - 'mailboxes' => 12, - 'active' => 1, - 'backupmx' => 0, - 'default_aliases' => 1 - ] - ); - - - $this->assertEmpty($dh->errormsg); - $this->assertEmpty($dh->infomsg); - - $this->assertTrue($ret); - - $ret = $dh->store(); - - $this->assertTrue($ret); - - // Need to add 'admin' as a domain_admin - db_insert('domain_admins', ['username' => 'admin', 'domain' => 'example.com', 'created' => '2020-01-01', 'active' => 1], ['created'], true); - - $dh = new DomainHandler(0, 'admin', true); - $dh->getList(''); - $result = $dh->result(); - - $this->assertEmpty($dh->infomsg); - $this->assertEmpty($dh->errormsg); - - $this->assertNotEmpty($result); - - $this->assertEquals('example.com', $result['example.com']['domain']); - $this->assertEquals('test domain', $result['example.com']['description']); - - $this->assertEquals(11, $result['example.com']['aliases']); - $this->assertEquals(12, $result['example.com']['mailboxes']); // default aliases. - - $this->assertEquals(4, $result['example.com']['alias_count']); // default aliases. - $this->assertEquals(0, $result['example.com']['mailbox_count']); - $this->assertEquals(1, $result['example.com']['active']); $x = new AliasHandler(1, 'admin', true); @@ -208,7 +183,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertEquals(4, count($list)); // default aliases. $x->set($values); - $x->store(); + $x->save(); $x->getList(''); @@ -230,4 +205,202 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertTrue($found, "check output : " . json_encode($list)); } + + + private function addDomain(string $domain, string $username): void + { + // Fake being an admin. + $_SESSION = [ + 'sessid' => [ + 'roles' => ['global-admin'] + ] + ]; + // Add example.com + $dh = new DomainHandler(1, $username, true); + + $dh->init('example.com'); + + $ret = $dh->set( + [ + 'domain' => $domain, + 'description' => 'test domain', + 'aliases' => 11, + 'mailboxes' => 12, + 'active' => 1, + 'backupmx' => 0, + 'default_aliases' => 1 + ] + ); + + + $this->assertEmpty($dh->errormsg); + $this->assertEmpty($dh->infomsg); + $this->assertTrue($ret); + $ret = $dh->save(); + $this->assertTrue($ret); + + // Need to add 'admin' as a domain_admin + db_insert('domain_admins', ['username' => $username, 'domain' => $domain, 'created' => '2020-01-01', 'active' => 1], ['created'], true); + + + $dh = new DomainHandler(0, $username, true); + $dh->getList(''); + $result = $dh->result(); + $this->assertEmpty($dh->infomsg); + $this->assertEmpty($dh->errormsg); + + $this->assertNotEmpty($result); + + $expected = [ + 'domain' => 'example.com', + 'description' => 'test domain', + 'aliases' => 11, + 'alias_count' => 4, + 'mailboxes' => 12, + 'mailbox_count' => 0, + 'backupmx' => 0, + 'active' => 1, + ]; + + foreach ($expected as $k => $v) { + $this->assertEquals($v, $result[$domain][$k]); + } + + } + + public function testYouCannotAddMoreAliasesThanTheDomainLimit() + { + + $this->addDomain('example.com', 'admin'); + + // default limit is 11 aliases.... so it should exit once we get past that. + + + $dh = new DomainHandler(0, 'admin', true); + $this->assertTrue($dh->getList('')); + $result = $dh->result(); + + // alias count limit is 11. + $this->assertEquals(11, $result['example.com']['aliases']); + + // 4 default aliases were added. + $this->assertEquals(4, $result['example.com']['alias_count']); + + + foreach (range(1, 7) as $char) { + + $newAlias = $char . '-test@example.com'; + + $x = new AliasHandler(1, 'admin', true); + $values = [ + 'localpart' => explode('@', $newAlias)[0], + 'domain' => 'example.com', + 'active' => 1, + 'address' => $newAlias, + 'goto' => ['dest@example.com'] + ]; + + $r = $x->init($newAlias); + + $this->assertTrue($r); + + $x->set($values); + $this->assertTrue($x->save()); + $this->assertTrue($x->getList('')); + $list = $x->result(); + $this->assertArrayHasKey($newAlias, $list); + $this->assertEquals(1, $list[$newAlias]['active']); + } + + // try and add one more - it should fail. + $x = new AliasHandler(1, 'admin', true); + $values = [ + 'localpart' => 'z-david.test', + 'domain' => 'example.com', + 'active' => 1, + 'address' => 'z-david.test@example.com', + 'goto' => ['dest@example.com'] + ]; + + $r = $x->init('z-david.test@example.com'); + + // doesn't already exist. + $this->assertFalse($r); + + // try saving .... + $x->set($values); + $this->assertFalse($x->save()); + + $this->assertEquals([ + 'address' => "You have reached your limit to create aliases!", + 0 => "one or more values are invalid!" + ], $x->errormsg); + + } + + + public function testLoadsOfAliasesGetHandledByPager() + { + + $this->addDomain('example.com', 'admin'); + + // default limit is 11 aliases.... so it should exit once we get past that. + + $dh = new DomainHandler(0, 'admin', true); + $dh->init('example.com'); + + $this->assertTrue($dh->set( + [ + //'domain' => 'example.com', + 'aliases' => 99, + 'mailboxes' => 88, + 'backupmx' => 0, + 'active' => 1, + ] + )); + + $this->assertTrue($dh->save()); + + $dh->getList(''); + + $domain = $dh->result()['example.com']; + + $this->assertEquals(99, $domain['aliases']); + $this->assertEquals(88, $domain['mailboxes']); + + foreach (range(1, 80) as $char) { + + $newAlias = $char . '-test@example.com'; + + $x = new AliasHandler(1, 'admin', true); + $values = [ + 'localpart' => explode('@', $newAlias)[0], + 'domain' => 'example.com', + 'active' => 1, + 'address' => $newAlias, + 'goto' => ['dest@example.com'] + ]; + + $r = $x->init($newAlias); + + $this->assertTrue($r); + + $x->set($values); + $this->assertTrue($x->save()); + $this->assertTrue($x->getList('')); + $list = $x->result(); + $this->assertArrayHasKey($newAlias, $list); + $this->assertEquals(1, $list[$newAlias]['active']); + } + + // try and add one more - it should fail. + $x = new AliasHandler(0, 'admin', true); + + $x->getList('', [], 5, 20); + $results = $x->result(); + + $this->assertEquals(5, count($results)); + $this->assertTrue(isset($results['31-test@example.com'])); + + } } diff --git a/tests/DomainHandlerTest.php b/tests/DomainHandlerTest.php index 91145611..cbb45fcc 100644 --- a/tests/DomainHandlerTest.php +++ b/tests/DomainHandlerTest.php @@ -48,7 +48,7 @@ class DomainHandlerTest extends \PHPUnit\Framework\TestCase $this->assertEmpty($dh->errormsg); $this->assertEmpty($dh->infomsg); $this->assertTrue($ret); - $ret = $dh->store(); + $ret = $dh->save(); $this->assertTrue($ret); // Need to add 'admin' as a domain_admin @@ -93,7 +93,7 @@ class DomainHandlerTest extends \PHPUnit\Framework\TestCase ); $this->assertTrue($ret); - $this->assertTrue($dh->store()); + $this->assertTrue($dh->save()); $this->assertEmpty($dh->errormsg); $dh->getList(''); diff --git a/tests/MailboxHandlerTest.php b/tests/MailboxHandlerTest.php index e2597d03..98813e2c 100644 --- a/tests/MailboxHandlerTest.php +++ b/tests/MailboxHandlerTest.php @@ -60,7 +60,7 @@ class MailboxHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertTrue($ret); - $ret = $dh->store(); + $ret = $dh->save(); $this->assertTrue($ret); @@ -109,7 +109,7 @@ class MailboxHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertEquals(0, count($list)); $x->set($values); - $x->store(); + $x->save(); $x->getList(''); @@ -149,7 +149,7 @@ class MailboxHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertEmpty($h->errormsg); $this->assertEmpty($h->infomsg); $this->assertTrue($r); - $this->assertTrue($h->store()); + $this->assertTrue($h->save()); $h->getList(''); $list = $h->result(); From f091948381c7332c0f1fd94c8ab17222086357f6 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Fri, 25 Sep 2020 21:31:45 +0100 Subject: [PATCH 064/691] move password check and recovery code generation out of PFAHandlers and into a Login class --- model/Login.php | 116 ++++++++++++++++++++++++++++++++++++++++++++ tests/LoginTest.php | 68 ++++++++++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 model/Login.php create mode 100644 tests/LoginTest.php diff --git a/model/Login.php b/model/Login.php new file mode 100644 index 00000000..b2fbd4a4 --- /dev/null +++ b/model/Login.php @@ -0,0 +1,116 @@ +table = table_by_key($tableName); + $this->id_field = $idField; + } + + /** + * Attempt to log a user in. + * @param string $tablename + * @param string $username + * @param string $password + * @return boolean true on successful login (i.e. password matches etc) + */ + public function login($username, $password): bool + { + + $active = db_get_boolean(true); + $query = "SELECT password FROM {$this->table} WHERE {$this->id_field} = :username AND active = :active"; + + $values = array('username' => $username, 'active' => $active); + + $result = db_query_all($query, $values); + if (sizeof($result) == 1) { + $row = $result[0]; + + $crypt_password = pacrypt($password, $row['password']); + + return hash_equals($row['password'], $crypt_password); + } + + // try and be near constant time regardless of whether the db user exists or not + $x = pacrypt('abc', 'def'); + + return hash_equals('not', 'comparable'); + } + + /** + * Updates db with password recovery code, and returns it. + * @param string $username + * @return false|string + * @throws Exception + */ + public function generatePasswordRecoveryCode(string $username) + { + + $sql = "SELECT count(1) FROM {$this->table} WHERE {$this->id_field} = :username AND active = :active"; + + $active = db_get_boolean(true); + + $values = [ + 'username' => $username, + 'active' => $active, + ]; + + $result = db_query_one($sql, $values); + + if ($result) { + $token = generate_password(); + $updatedRows = db_update($this->table, $this->id_field, $username, array( + 'token' => pacrypt($token), + 'token_validity' => date("Y-m-d H:i:s", strtotime('+ 1 hour')), + )); + + if ($updatedRows == 1) { + return $token; + } + } + return false; + } + + + /** + * @param string $username + * @param string $new_password + * @param string $old_password + * + * All passwords need to be plain text; they'll be hashed appropriately + * as per the configuration in config.inc.php + * + * @return boolean true on success; false on failure + * @throws \Exception if invalid user, or db update fails. + */ + public function changePassword($username, $new_password, $old_password): bool + { + + list(/*NULL*/, $domain) = explode('@', $username); + + $login = new Login($this->table, $this->id_field); + + if (!$login->login($username, $old_password)) { + throw new \Exception(Config::Lang('pPassword_password_current_text_error')); + } + + $set = array( + 'password' => pacrypt($new_password), + ); + + $result = db_update('mailbox', 'username', $username, $set); + + if ($result != 1) { + db_log($domain, 'edit_password', "FAILURE: " . $username); + throw new \Exception(Config::lang('pEdit_mailbox_result_error')); + } + + db_log($domain, 'edit_password', $username); + return true; + } +} \ No newline at end of file diff --git a/tests/LoginTest.php b/tests/LoginTest.php new file mode 100644 index 00000000..c375451c --- /dev/null +++ b/tests/LoginTest.php @@ -0,0 +1,68 @@ +cleanUp(); + + db_execute("INSERT INTO domain(`domain`, description, transport) values ('example.com', 'test', 'foo')", [], true); + + db_execute( + "INSERT INTO mailbox(username, password, `name`, maildir, local_part, `domain`) +VALUES(:username, :password, :name, :maildir, :local_part, :domain)", + [ + 'username' => 'test@example.com', + 'password' => pacrypt('foobar'), + 'name' => 'test user', + 'maildir' => '/foo/bar', + 'local_part' => 'test', + 'domain' => 'example.com', + ]); + parent::setUp(); + } + + + public function tearDown(): void + { + $this->cleanUp(); + parent::tearDown(); // TODO: Change the autogenerated stub + } + + private function cleanUp() + { + db_query('DELETE FROM mailbox'); + db_query('DELETE FROM domain'); + } + + public function testInvalidUsers() + { + $login = new Login('mailbox', 'username'); + + $this->assertFalse($login->login('test', 'password')); + $this->assertFalse($login->login('test', '')); + $this->assertFalse($login->login('', '')); + } + + + public function testValidLogin() + { + $login = new Login('mailbox', 'username'); + + $this->assertFalse($login->login('test', 'password')); + $this->assertFalse($login->login('test', 'foobar')); + $this->assertFalse($login->login('', '')); + + } + + public function testPasswordRecovery() + { + + $login = new Login('mailbox', 'username'); + $this->assertFalse($login->generatePasswordRecoveryCode('')); + $this->assertFalse($login->generatePasswordRecoveryCode('doesnotexist')); + $this->assertNotEmpty($login->generatePasswordRecoveryCode('test@example.com')); + + } +} From b868f950bfe0b12e89926c25782613817c47824b Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Fri, 25 Sep 2020 21:32:53 +0100 Subject: [PATCH 065/691] refactor Login stuff out of Handler classes into Login... add tests --- model/AdminpasswordHandler.php | 4 +- model/MailboxHandler.php | 43 ----------------- model/PFAHandler.php | 47 ------------------- model/VacationHandler.php | 7 +-- public/login.php | 5 +- public/users/login.php | 5 +- public/users/password-recover.php | 13 ++++-- public/users/password.php | 27 +++++++---- public/xmlrpc.php | 78 +++++++++++++++++++++---------- tests/MailboxHandlerTest.php | 5 -- 10 files changed, 93 insertions(+), 141 deletions(-) diff --git a/model/AdminpasswordHandler.php b/model/AdminpasswordHandler.php index 5799e22e..badd63a3 100644 --- a/model/AdminpasswordHandler.php +++ b/model/AdminpasswordHandler.php @@ -80,7 +80,9 @@ class AdminpasswordHandler extends PFAHandler { * check if old password is correct */ protected function _validate_oldpass($field, $val) { - if ($this->login($this->id, $val)) { + + $l = new Login('admin', 'username'); + if($l->login($this->id, $val)) { return true; } diff --git a/model/MailboxHandler.php b/model/MailboxHandler.php index 596eccd4..9ac6fd45 100644 --- a/model/MailboxHandler.php +++ b/model/MailboxHandler.php @@ -736,49 +736,6 @@ class MailboxHandler extends PFAHandler { return true; } - - /******************************************************************************************************************** - old functions - we'll see what happens to them - (at least they should use the *Handler functions instead of doing SQL) - /********************************************************************************************************************/ - - /** - * @return boolean true on success; false on failure - * @param string $new_password - * @param string $old_password - * @param bool $match = true - * - * All passwords need to be plain text; they'll be hashed appropriately - * as per the configuration in config.inc.php - */ - public function change_pw($new_password, $old_password, $match = true) { - list(/*NULL*/, $domain) = explode('@', $this->id); - - if ($match == true) { - if (!$this->login($this->id, $old_password)) { - db_log($domain, 'edit_password', "MATCH FAILURE: " . $this->id); - $this->errormsg[] = Config::Lang('pPassword_password_current_text_error'); - return false; - } - } - - $set = array( - 'password' => pacrypt($new_password) , - ); - - $result = db_update('mailbox', 'username', $this->id, $set); - - if ($result != 1) { - db_log($domain, 'edit_password', "FAILURE: " . $this->id); - $this->errormsg[] = Config::lang('pEdit_mailbox_result_error'); - return false; - } - - db_log($domain, 'edit_password', $this->id); - return true; - } - - #TODO: more self explaining language strings! } diff --git a/model/PFAHandler.php b/model/PFAHandler.php index f763dde0..74cbae4e 100644 --- a/model/PFAHandler.php +++ b/model/PFAHandler.php @@ -822,53 +822,6 @@ abstract class PFAHandler { return true; } - - /** - * Attempt to log a user in. - * @param string $username - * @param string $password - * @return boolean true on successful login (i.e. password matches etc) - */ - public function login($username, $password) { - $table = table_by_key($this->db_table); - $active = db_get_boolean(true); - $query = "SELECT password FROM $table WHERE {$this->id_field} = :username AND active = :active"; - - $values = array('username' => $username, 'active' => $active); - - $result = db_query_all($query,$values); - if (sizeof($result) == 1) { - $row = $result[0]; - - $crypt_password = pacrypt($password, $row['password']); - - return hash_equals($row['password'], $crypt_password); - } - // try and be near constant time regardless of whether the db user exists or not - $x = pacrypt('abc', 'def'); - return hash_equals('not', 'comparable'); - } - - /** - * Generate and store a unique password reset token valid for one hour - * @param string $username - * @return false|string - */ - public function getPasswordRecoveryCode($username) { - if ($this->init($username)) { - $token = generate_password(); - $updatedRows = db_update($this->db_table, $this->id_field, $username, array( - 'token' => pacrypt($token), - 'token_validity' => date("Y-m-d H:i:s", strtotime('+ 1 hour')), - )); - - if ($updatedRows == 1) { - return $token; - } - } - return false; - } - /** * Verify user's one time password reset token * @param string $username diff --git a/model/VacationHandler.php b/model/VacationHandler.php index 1b5bce31..6126daf3 100644 --- a/model/VacationHandler.php +++ b/model/VacationHandler.php @@ -18,11 +18,8 @@ class VacationHandler extends PFAHandler { */ protected $domain_field = 'domain'; - /** - * @return void - */ - public function init($id) { - die('VacationHandler is not yet ready to be used with *Handler methods'); # obvious TODO: remove when it's ready ;-) + public function init($id) : bool { + throw new \Exception('VacationHandler is not yet ready to be used with *Handler methods'); } /** diff --git a/public/login.php b/public/login.php index 39a36330..b2e3a4e7 100644 --- a/public/login.php +++ b/public/login.php @@ -55,7 +55,10 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { } $h = new AdminHandler(); - if ($h->login($fUsername, $fPassword)) { + + $login = new Login('admin', $h->getId_field()); + if($login->login($fUsername, $fPassword)) { + init_session($fUsername, true); # they've logged in, so see if they are a domain admin, as well. diff --git a/public/users/login.php b/public/users/login.php index 59c64fe8..35f34ddc 100644 --- a/public/users/login.php +++ b/public/users/login.php @@ -47,9 +47,10 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { } $h = new MailboxHandler(); - if ($h->login($fUsername, $fPassword)) { - init_session($fUsername, false); + $login = new Login('mailbox', 'username');; + if ($login->login($fUsername, $fPassword)) { + init_session($fUsername, false); header("Location: main.php"); exit; } else { diff --git a/public/users/password-recover.php b/public/users/password-recover.php index ff5c4c61..687d6b91 100644 --- a/public/users/password-recover.php +++ b/public/users/password-recover.php @@ -38,7 +38,8 @@ if ($context === 'admin' && !Config::read('forgotten_admin_password_reset') || $ die('Password reset is disabled by configuration option: forgotten_admin_password_reset'); } -function sendCodebyEmail($to, $username, $code) { +function sendCodebyEmail($to, $username, $code) +{ $https = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https' : 'http'; $_SERVER['REQUEST_SCHEME'] = isset($_SERVER['REQUEST_SCHEME']) ? $_SERVER['REQUEST_SCHEME'] : $https; @@ -48,7 +49,8 @@ function sendCodebyEmail($to, $username, $code) { return smtp_mail($to, Config::read('admin_email'), Config::Lang('pPassword_welcome'), Config::read('admin_smtp_password'), Config::lang_f('pPassword_recovery_email_body', $url)); } -function sendCodebySMS($to, $username, $code) { +function sendCodebySMS($to, $username, $code) +{ $text = Config::lang_f('pPassword_recovery_sms_body', $code); $function = Config::read('sms_send_function'); @@ -69,8 +71,13 @@ if ($_SERVER['REQUEST_METHOD'] === "POST") { $tUsername = escape_string($username); + $table = $context === 'admin' ? 'admin' : 'mailbox'; + $login = new Login($table, 'username'); + + $token = $login->generatePasswordRecoveryCode($tUsername); + $handler = $context === 'admin' ? new AdminHandler : new MailboxHandler; - $token = $handler->getPasswordRecoveryCode($tUsername); + if ($token !== false) { $table = table_by_key($context === 'users' ? 'mailbox' : 'admin'); $row = db_query_one("SELECT * FROM $table WHERE username= :username", array('username' => $username)); diff --git a/public/users/password.php b/public/users/password.php index cd27a6a2..6f57e8cd 100644 --- a/public/users/password.php +++ b/public/users/password.php @@ -56,26 +56,33 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { flash_error($validpass[0]); # TODO: honor all error messages, not only the first one $error += 1; } - - $mh = new MailboxHandler; - if (!$mh->login($username, $fPassword_current)) { + $mh = new MailboxHandler(); + + $login = new Login('mailbox', 'username'); + + if (!$login->login($username, $fPassword_current)) { $error += 1; $pPassword_password_current_text = $PALANG['pPassword_password_current_text_error']; } + if (empty($fPassword) or ($fPassword != $fPassword2)) { $error += 1; $pPassword_password_text = $PALANG['pPassword_password_text_error']; } if ($error == 0) { - $mh->init($username); # TODO: error handling - if ($mh->change_pw($fPassword, $fPassword_current)) { - flash_info(Config::Lang_f('pPassword_result_success', $username)); - header("Location: main.php"); - exit(0); - } else { - flash_error(Config::Lang_f('pPassword_result_error', $username)); + + try { + if ($login->changePassword($username, $fPassword, $fPassword_current)) { + flash_info(Config::Lang_f('pPassword_result_success', $username)); + header("Location: main.php"); + exit(0); + } else { + flash_error(Config::Lang_f('pPassword_result_error', $username)); + } + } catch (\Exception $e) { + flash_error($e->getMessage()); } } } diff --git a/public/xmlrpc.php b/public/xmlrpc.php index 035f240c..ce0421a7 100644 --- a/public/xmlrpc.php +++ b/public/xmlrpc.php @@ -44,9 +44,11 @@ $server = new Zend_XmlRpc_Server(); * @param string $password * @return boolean true on success, else false. */ -function login($username, $password) { +function login($username, $password) +{ $h = new MailboxHandler(); - if ($h->login($username, $password)) { + $login = new Login('mailbox', 'username'); + if ($login->login($username, $password)) { session_regenerate_id(); $_SESSION['authenticated'] = true; $_SESSION['sessid'] = array(); @@ -66,37 +68,56 @@ if (!isset($_SESSION['authenticated'])) { echo $server->handle(); -class UserProxy { +class UserProxy +{ /** * @param string $old_password * @param string $new_password * @return boolean true on success */ - public function changePassword($old_password, $new_password) { + public function changePassword($old_password, $new_password) + { $uh = new MailboxHandler(); - if (!$uh->init($_SESSION['sessid']['username'])) { + $username = $_SESSION['sessid']['username'] ?? ''; + + if (empty($username)) { + throw new \Exception("not logged in? invalid session"); + } + + if (!$uh->init($username)) { + return false; // user doesn't exist. + } + + $login = new Login('mailbox', 'username'); + + try { + return $login->changePassword($username, $new_password, $old_password); + } catch (\Exception $e) { return false; } - return $uh->change_pw($new_password, $old_password); + } /** - * @param string $username - * @param string $password - * @return boolean true if successful. - */ - public function login($username, $password) { - $uh = new MailboxHandler(); # $_SESSION['sessid']['username']); - return $uh->login($username, $password); + * @param string $username + * @param string $password + * @return boolean true if successful. + */ + public function login($username, $password) + { + $login = new Login('mailbox', 'username'); + return $login->login($username, $password); } } -class VacationProxy { +class VacationProxy +{ /** * @return boolean true if the vacation is removed successfully. Else false. */ - public function remove() { + public function remove() + { $vh = new VacationHandler($_SESSION['sessid']['username']); return $vh->remove(); } @@ -105,7 +126,8 @@ class VacationProxy { * @return boolean true if vacation stuff is enabled in this instance of postfixadmin * and the user has the ability to make changes to it. */ - public function isVacationSupported() { + public function isVacationSupported() + { $vh = new VacationHandler($_SESSION['sessid']['username']); return $vh->vacation_supported(); } @@ -113,7 +135,8 @@ class VacationProxy { /** * @return boolean true if the user has an active vacation record etc. */ - public function checkVacation() { + public function checkVacation() + { $vh = new VacationHandler($_SESSION['sessid']['username']); return $vh->check_vacation(); } @@ -121,7 +144,8 @@ class VacationProxy { /** * @return array|bool - either array of vacation details or boolean false if the user has none. */ - public function getDetails() { + public function getDetails() + { $vh = new VacationHandler($_SESSION['sessid']['username']); return $vh->get_details(); } @@ -135,16 +159,20 @@ class VacationProxy { * @return boolean true on success. * Whatiis @replyType?? for */ - public function setAway($subject, $body, $interval_time = 0, $activeFrom = '2000-01-01', $activeUntil = '2099-12-31') { + public function setAway($subject, $body, $interval_time = 0, $activeFrom = '2000-01-01', $activeUntil = '2099-12-31') + { $vh = new VacationHandler($_SESSION['sessid']['username']); return $vh->set_away($subject, $body, $interval_time, $activeFrom, $activeUntil); } } -class AliasProxy { + +class AliasProxy +{ /** * @return array - array of aliases this user has. Array may be empty. */ - public function get() { + public function get() + { $ah = new AliasHandler(); $ah->init($_SESSION['sessid']['username']); /* I see no point in returning special addresses to the user. */ @@ -158,10 +186,11 @@ class AliasProxy { * @param string flag to set ('forward_and_store' or 'remote_only') * @return boolean true */ - public function update($addresses, $flags) { + public function update($addresses, $flags) + { $ah = new AliasHandler(); $ah->init($_SESSION['sessid']['username']); - + $values = ['goto' => $addresses]; if ($flags == 'forward_and_store') { @@ -184,7 +213,8 @@ class AliasProxy { * @return boolean true if the user has 'store_and_forward' set. * (i.e. their email address is also in the alias table). IF it returns false, then it's 'remote_only' */ - public function hasStoreAndForward() { + public function hasStoreAndForward() + { $ah = new AliasHandler(); $ah->init($_SESSION['sessid']['username']); $ah->view(); diff --git a/tests/MailboxHandlerTest.php b/tests/MailboxHandlerTest.php index 98813e2c..051f161a 100644 --- a/tests/MailboxHandlerTest.php +++ b/tests/MailboxHandlerTest.php @@ -21,11 +21,6 @@ class MailboxHandlerTest extends \PHPUnit\Framework\TestCase { $this->assertEmpty($results); - $this->assertFalse($x->checkPasswordRecoveryCode('test', 'fake')); - - $token = $x->getPasswordRecoveryCode('test.person.does.not.exist@example.com'); - - $this->assertFalse($token); } From 7107e17c4cbfd1eb4349fa0992cf74a24f79876e Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Fri, 25 Sep 2020 21:33:26 +0100 Subject: [PATCH 066/691] composer format --- model/AdminpasswordHandler.php | 3 +-- model/Login.php | 20 +++++--------- public/login.php | 3 +-- public/users/login.php | 3 ++- public/users/password-recover.php | 6 ++--- public/users/password.php | 1 - public/xmlrpc.php | 43 ++++++++++--------------------- tests/AliasHandlerTest.php | 38 +++++++-------------------- tests/DomainHandlerTest.php | 11 +++----- tests/LoginTest.php | 25 +++++------------- tests/MailboxHandlerTest.php | 1 - 11 files changed, 46 insertions(+), 108 deletions(-) diff --git a/model/AdminpasswordHandler.php b/model/AdminpasswordHandler.php index badd63a3..7d071aa9 100644 --- a/model/AdminpasswordHandler.php +++ b/model/AdminpasswordHandler.php @@ -80,9 +80,8 @@ class AdminpasswordHandler extends PFAHandler { * check if old password is correct */ protected function _validate_oldpass($field, $val) { - $l = new Login('admin', 'username'); - if($l->login($this->id, $val)) { + if ($l->login($this->id, $val)) { return true; } diff --git a/model/Login.php b/model/Login.php index b2fbd4a4..f6a850ce 100644 --- a/model/Login.php +++ b/model/Login.php @@ -1,13 +1,11 @@ table = table_by_key($tableName); $this->id_field = $idField; } @@ -19,9 +17,7 @@ class Login * @param string $password * @return boolean true on successful login (i.e. password matches etc) */ - public function login($username, $password): bool - { - + public function login($username, $password): bool { $active = db_get_boolean(true); $query = "SELECT password FROM {$this->table} WHERE {$this->id_field} = :username AND active = :active"; @@ -48,9 +44,7 @@ class Login * @return false|string * @throws Exception */ - public function generatePasswordRecoveryCode(string $username) - { - + public function generatePasswordRecoveryCode(string $username) { $sql = "SELECT count(1) FROM {$this->table} WHERE {$this->id_field} = :username AND active = :active"; $active = db_get_boolean(true); @@ -88,9 +82,7 @@ class Login * @return boolean true on success; false on failure * @throws \Exception if invalid user, or db update fails. */ - public function changePassword($username, $new_password, $old_password): bool - { - + public function changePassword($username, $new_password, $old_password): bool { list(/*NULL*/, $domain) = explode('@', $username); $login = new Login($this->table, $this->id_field); @@ -113,4 +105,4 @@ class Login db_log($domain, 'edit_password', $username); return true; } -} \ No newline at end of file +} diff --git a/public/login.php b/public/login.php index b2e3a4e7..501156e8 100644 --- a/public/login.php +++ b/public/login.php @@ -57,8 +57,7 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { $h = new AdminHandler(); $login = new Login('admin', $h->getId_field()); - if($login->login($fUsername, $fPassword)) { - + if ($login->login($fUsername, $fPassword)) { init_session($fUsername, true); # they've logged in, so see if they are a domain admin, as well. diff --git a/public/users/login.php b/public/users/login.php index 35f34ddc..c652c17f 100644 --- a/public/users/login.php +++ b/public/users/login.php @@ -48,7 +48,8 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { $h = new MailboxHandler(); - $login = new Login('mailbox', 'username');; + $login = new Login('mailbox', 'username'); + ; if ($login->login($fUsername, $fPassword)) { init_session($fUsername, false); header("Location: main.php"); diff --git a/public/users/password-recover.php b/public/users/password-recover.php index 687d6b91..fc2ae556 100644 --- a/public/users/password-recover.php +++ b/public/users/password-recover.php @@ -38,8 +38,7 @@ if ($context === 'admin' && !Config::read('forgotten_admin_password_reset') || $ die('Password reset is disabled by configuration option: forgotten_admin_password_reset'); } -function sendCodebyEmail($to, $username, $code) -{ +function sendCodebyEmail($to, $username, $code) { $https = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https' : 'http'; $_SERVER['REQUEST_SCHEME'] = isset($_SERVER['REQUEST_SCHEME']) ? $_SERVER['REQUEST_SCHEME'] : $https; @@ -49,8 +48,7 @@ function sendCodebyEmail($to, $username, $code) return smtp_mail($to, Config::read('admin_email'), Config::Lang('pPassword_welcome'), Config::read('admin_smtp_password'), Config::lang_f('pPassword_recovery_email_body', $url)); } -function sendCodebySMS($to, $username, $code) -{ +function sendCodebySMS($to, $username, $code) { $text = Config::lang_f('pPassword_recovery_sms_body', $code); $function = Config::read('sms_send_function'); diff --git a/public/users/password.php b/public/users/password.php index 6f57e8cd..4cf27032 100644 --- a/public/users/password.php +++ b/public/users/password.php @@ -72,7 +72,6 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { } if ($error == 0) { - try { if ($login->changePassword($username, $fPassword, $fPassword_current)) { flash_info(Config::Lang_f('pPassword_result_success', $username)); diff --git a/public/xmlrpc.php b/public/xmlrpc.php index ce0421a7..5e0d47ad 100644 --- a/public/xmlrpc.php +++ b/public/xmlrpc.php @@ -44,8 +44,7 @@ $server = new Zend_XmlRpc_Server(); * @param string $password * @return boolean true on success, else false. */ -function login($username, $password) -{ +function login($username, $password) { $h = new MailboxHandler(); $login = new Login('mailbox', 'username'); if ($login->login($username, $password)) { @@ -68,16 +67,14 @@ if (!isset($_SESSION['authenticated'])) { echo $server->handle(); -class UserProxy -{ +class UserProxy { /** * @param string $old_password * @param string $new_password * @return boolean true on success */ - public function changePassword($old_password, $new_password) - { + public function changePassword($old_password, $new_password) { $uh = new MailboxHandler(); $username = $_SESSION['sessid']['username'] ?? ''; @@ -96,7 +93,6 @@ class UserProxy } catch (\Exception $e) { return false; } - } /** @@ -104,20 +100,17 @@ class UserProxy * @param string $password * @return boolean true if successful. */ - public function login($username, $password) - { + public function login($username, $password) { $login = new Login('mailbox', 'username'); return $login->login($username, $password); } } -class VacationProxy -{ +class VacationProxy { /** * @return boolean true if the vacation is removed successfully. Else false. */ - public function remove() - { + public function remove() { $vh = new VacationHandler($_SESSION['sessid']['username']); return $vh->remove(); } @@ -126,8 +119,7 @@ class VacationProxy * @return boolean true if vacation stuff is enabled in this instance of postfixadmin * and the user has the ability to make changes to it. */ - public function isVacationSupported() - { + public function isVacationSupported() { $vh = new VacationHandler($_SESSION['sessid']['username']); return $vh->vacation_supported(); } @@ -135,8 +127,7 @@ class VacationProxy /** * @return boolean true if the user has an active vacation record etc. */ - public function checkVacation() - { + public function checkVacation() { $vh = new VacationHandler($_SESSION['sessid']['username']); return $vh->check_vacation(); } @@ -144,8 +135,7 @@ class VacationProxy /** * @return array|bool - either array of vacation details or boolean false if the user has none. */ - public function getDetails() - { + public function getDetails() { $vh = new VacationHandler($_SESSION['sessid']['username']); return $vh->get_details(); } @@ -159,20 +149,17 @@ class VacationProxy * @return boolean true on success. * Whatiis @replyType?? for */ - public function setAway($subject, $body, $interval_time = 0, $activeFrom = '2000-01-01', $activeUntil = '2099-12-31') - { + public function setAway($subject, $body, $interval_time = 0, $activeFrom = '2000-01-01', $activeUntil = '2099-12-31') { $vh = new VacationHandler($_SESSION['sessid']['username']); return $vh->set_away($subject, $body, $interval_time, $activeFrom, $activeUntil); } } -class AliasProxy -{ +class AliasProxy { /** * @return array - array of aliases this user has. Array may be empty. */ - public function get() - { + public function get() { $ah = new AliasHandler(); $ah->init($_SESSION['sessid']['username']); /* I see no point in returning special addresses to the user. */ @@ -186,8 +173,7 @@ class AliasProxy * @param string flag to set ('forward_and_store' or 'remote_only') * @return boolean true */ - public function update($addresses, $flags) - { + public function update($addresses, $flags) { $ah = new AliasHandler(); $ah->init($_SESSION['sessid']['username']); @@ -213,8 +199,7 @@ class AliasProxy * @return boolean true if the user has 'store_and_forward' set. * (i.e. their email address is also in the alias table). IF it returns false, then it's 'remote_only' */ - public function hasStoreAndForward() - { + public function hasStoreAndForward() { $ah = new AliasHandler(); $ah->init($_SESSION['sessid']['username']); $ah->view(); diff --git a/tests/AliasHandlerTest.php b/tests/AliasHandlerTest.php index ce4a9c1e..d6861832 100644 --- a/tests/AliasHandlerTest.php +++ b/tests/AliasHandlerTest.php @@ -1,10 +1,7 @@ [ @@ -14,8 +11,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase parent::setUp(); } - protected function tearDown(): void - { + protected function tearDown(): void { $_SESSION = []; db_query('DELETE FROM alias'); db_query('DELETE FROM domain_admins'); @@ -24,8 +20,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase parent::tearDown(); } - public function testBasic() - { + public function testBasic() { $x = new AliasHandler(); $list = $x->getList(""); $this->assertTrue($list); @@ -34,8 +29,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase } - public function testCannotAddAliasUntilDomainIsThere() - { + public function testCannotAddAliasUntilDomainIsThere() { // Fake us being an admin. @@ -69,8 +63,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase /** * @see https://github.com/postfixadmin/postfixadmin/pull/375 and https://github.com/postfixadmin/postfixadmin/issues/358 */ - public function testCannotAddAliasThatPointsToItself() - { + public function testCannotAddAliasThatPointsToItself() { // Fake being an admin. $_SESSION = [ 'sessid' => [ @@ -153,8 +146,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase ], $x->errormsg); } - public function testAddingDataEtc() - { + public function testAddingDataEtc() { // Fake being an admin. $_SESSION = [ @@ -207,8 +199,7 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase } - private function addDomain(string $domain, string $username): void - { + private function addDomain(string $domain, string $username): void { // Fake being an admin. $_SESSION = [ 'sessid' => [ @@ -265,12 +256,9 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase foreach ($expected as $k => $v) { $this->assertEquals($v, $result[$domain][$k]); } - } - public function testYouCannotAddMoreAliasesThanTheDomainLimit() - { - + public function testYouCannotAddMoreAliasesThanTheDomainLimit() { $this->addDomain('example.com', 'admin'); // default limit is 11 aliases.... so it should exit once we get past that. @@ -288,7 +276,6 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase foreach (range(1, 7) as $char) { - $newAlias = $char . '-test@example.com'; $x = new AliasHandler(1, 'admin', true); @@ -335,13 +322,10 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase 'address' => "You have reached your limit to create aliases!", 0 => "one or more values are invalid!" ], $x->errormsg); - } - public function testLoadsOfAliasesGetHandledByPager() - { - + public function testLoadsOfAliasesGetHandledByPager() { $this->addDomain('example.com', 'admin'); // default limit is 11 aliases.... so it should exit once we get past that. @@ -369,7 +353,6 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase $this->assertEquals(88, $domain['mailboxes']); foreach (range(1, 80) as $char) { - $newAlias = $char . '-test@example.com'; $x = new AliasHandler(1, 'admin', true); @@ -401,6 +384,5 @@ class AliasHandlerTest extends \PHPUnit\Framework\TestCase $this->assertEquals(5, count($results)); $this->assertTrue(isset($results['31-test@example.com'])); - } } diff --git a/tests/DomainHandlerTest.php b/tests/DomainHandlerTest.php index cbb45fcc..e9601389 100644 --- a/tests/DomainHandlerTest.php +++ b/tests/DomainHandlerTest.php @@ -1,9 +1,7 @@ getList(""); @@ -15,8 +13,7 @@ class DomainHandlerTest extends \PHPUnit\Framework\TestCase $this->assertEmpty($results); } - public function testAddAndUpdate() - { + public function testAddAndUpdate() { // Fake being an admin. $_SESSION = [ 'sessid' => [ @@ -101,7 +98,5 @@ class DomainHandlerTest extends \PHPUnit\Framework\TestCase $this->assertEquals(99, $d['aliases']); $this->assertEquals(88, $d['mailboxes']); - - } } diff --git a/tests/LoginTest.php b/tests/LoginTest.php index c375451c..bcb8845c 100644 --- a/tests/LoginTest.php +++ b/tests/LoginTest.php @@ -1,10 +1,7 @@ cleanUp(); db_execute("INSERT INTO domain(`domain`, description, transport) values ('example.com', 'test', 'foo')", [], true); @@ -24,20 +21,17 @@ VALUES(:username, :password, :name, :maildir, :local_part, :domain)", } - public function tearDown(): void - { + public function tearDown(): void { $this->cleanUp(); parent::tearDown(); // TODO: Change the autogenerated stub } - private function cleanUp() - { + private function cleanUp() { db_query('DELETE FROM mailbox'); db_query('DELETE FROM domain'); } - public function testInvalidUsers() - { + public function testInvalidUsers() { $login = new Login('mailbox', 'username'); $this->assertFalse($login->login('test', 'password')); @@ -46,23 +40,18 @@ VALUES(:username, :password, :name, :maildir, :local_part, :domain)", } - public function testValidLogin() - { + public function testValidLogin() { $login = new Login('mailbox', 'username'); $this->assertFalse($login->login('test', 'password')); $this->assertFalse($login->login('test', 'foobar')); $this->assertFalse($login->login('', '')); - } - public function testPasswordRecovery() - { - + public function testPasswordRecovery() { $login = new Login('mailbox', 'username'); $this->assertFalse($login->generatePasswordRecoveryCode('')); $this->assertFalse($login->generatePasswordRecoveryCode('doesnotexist')); $this->assertNotEmpty($login->generatePasswordRecoveryCode('test@example.com')); - } } diff --git a/tests/MailboxHandlerTest.php b/tests/MailboxHandlerTest.php index 051f161a..f9eff085 100644 --- a/tests/MailboxHandlerTest.php +++ b/tests/MailboxHandlerTest.php @@ -20,7 +20,6 @@ class MailboxHandlerTest extends \PHPUnit\Framework\TestCase { $results = $x->result(); $this->assertEmpty($results); - } From d7fa33a3ed4644069053db9ae09406d3215be2f6 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Fri, 25 Sep 2020 21:43:34 +0100 Subject: [PATCH 067/691] s/store/save/g --- public/edit.php | 2 +- public/editactive.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/edit.php b/public/edit.php index 2ffea21d..11a7fe35 100644 --- a/public/edit.php +++ b/public/edit.php @@ -157,7 +157,7 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { $form_fields = $handler->getStruct(); # refresh $form_fields - set() might have changed something if ($error != 1) { - if (!$handler->store()) { + if (!$handler->save()) { $errormsg = $handler->errormsg; } else { flash_info($handler->infomsg); diff --git a/public/editactive.php b/public/editactive.php index b8c29c22..6de2ad05 100644 --- a/public/editactive.php +++ b/public/editactive.php @@ -47,7 +47,7 @@ if ($handler->init($id)) { # errors will be displayed as last step anyway, no ne } if ($handler->set(array('active' => $active))) { - $handler->store(); + $handler->save(); } } From 6ad44679a7486e8d49b189f1d8d90bed464355ef Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Fri, 25 Sep 2020 21:52:22 +0100 Subject: [PATCH 068/691] change default theme to the bootstrap one --- config.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.inc.php b/config.inc.php index 949fe96e..97464412 100644 --- a/config.inc.php +++ b/config.inc.php @@ -672,11 +672,11 @@ function x_send_sms_clickatell($to, $message) { */ // Theme Config -$CONF['theme'] = 'default'; +$CONF['theme'] = 'bootstrap'; // Specify your own favicon, logo and CSS file $CONF['theme_favicon'] = 'images/favicon.ico'; $CONF['theme_logo'] = 'images/logo-default.png'; -$CONF['theme_css'] = 'css/default.css'; +$CONF['theme_css'] = 'css/bootstrap.css'; // If you want to customize some styles without editing the $CONF['theme_css'] file, // you can add a custom CSS file. It will be included after $CONF['theme_css']. $CONF['theme_custom_css'] = ''; From 4e430e59251fccec0f9d8df57bf5140fd07b070c Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 26 Sep 2020 09:48:26 +0100 Subject: [PATCH 069/691] reformat --- tests/DomainHandlerTest.php | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/tests/DomainHandlerTest.php b/tests/DomainHandlerTest.php index 91145611..53d6fd28 100644 --- a/tests/DomainHandlerTest.php +++ b/tests/DomainHandlerTest.php @@ -1,9 +1,7 @@ getList(""); @@ -15,8 +13,7 @@ class DomainHandlerTest extends \PHPUnit\Framework\TestCase $this->assertEmpty($results); } - public function testAddAndUpdate() - { + public function testAddAndUpdate() { // Fake being an admin. $_SESSION = [ 'sessid' => [ @@ -101,7 +98,5 @@ class DomainHandlerTest extends \PHPUnit\Framework\TestCase $this->assertEquals(99, $d['aliases']); $this->assertEquals(88, $d['mailboxes']); - - } } From ce8c636eb51e3e5898220f54b0366126b2607a88 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 26 Sep 2020 09:58:05 +0100 Subject: [PATCH 070/691] rejig Login::__construct() as only one arg is really needed --- model/AdminpasswordHandler.php | 2 +- model/Login.php | 19 ++++++++++--------- public/login.php | 2 +- public/users/login.php | 4 +--- public/users/password-recover.php | 4 +--- public/users/password.php | 4 +--- public/xmlrpc.php | 7 +++---- tests/LoginTest.php | 6 +++--- 8 files changed, 21 insertions(+), 27 deletions(-) diff --git a/model/AdminpasswordHandler.php b/model/AdminpasswordHandler.php index 7d071aa9..f81ccaf0 100644 --- a/model/AdminpasswordHandler.php +++ b/model/AdminpasswordHandler.php @@ -80,7 +80,7 @@ class AdminpasswordHandler extends PFAHandler { * check if old password is correct */ protected function _validate_oldpass($field, $val) { - $l = new Login('admin', 'username'); + $l = new Login('admin'); if ($l->login($this->id, $val)) { return true; } diff --git a/model/Login.php b/model/Login.php index f6a850ce..5bf1679b 100644 --- a/model/Login.php +++ b/model/Login.php @@ -3,11 +3,14 @@ class Login { private $table; - private $id_field; - public function __construct(string $tableName, string $idField) { + public function __construct(string $tableName) { + $ok = ['mailbox', 'admin']; + + if(!in_array($tableName, $ok)) { + throw new \InvalidArgumentException("Unsupported tableName for login: " . $tableName); + } $this->table = table_by_key($tableName); - $this->id_field = $idField; } /** @@ -19,7 +22,7 @@ class Login { */ public function login($username, $password): bool { $active = db_get_boolean(true); - $query = "SELECT password FROM {$this->table} WHERE {$this->id_field} = :username AND active = :active"; + $query = "SELECT password FROM {$this->table} WHERE username = :username AND active = :active"; $values = array('username' => $username, 'active' => $active); @@ -45,7 +48,7 @@ class Login { * @throws Exception */ public function generatePasswordRecoveryCode(string $username) { - $sql = "SELECT count(1) FROM {$this->table} WHERE {$this->id_field} = :username AND active = :active"; + $sql = "SELECT count(1) FROM {$this->table} WHERE username = :username AND active = :active"; $active = db_get_boolean(true); @@ -58,7 +61,7 @@ class Login { if ($result) { $token = generate_password(); - $updatedRows = db_update($this->table, $this->id_field, $username, array( + $updatedRows = db_update($this->table, 'username', $username, array( 'token' => pacrypt($token), 'token_validity' => date("Y-m-d H:i:s", strtotime('+ 1 hour')), )); @@ -85,9 +88,7 @@ class Login { public function changePassword($username, $new_password, $old_password): bool { list(/*NULL*/, $domain) = explode('@', $username); - $login = new Login($this->table, $this->id_field); - - if (!$login->login($username, $old_password)) { + if (!$this->login($username, $old_password)) { throw new \Exception(Config::Lang('pPassword_password_current_text_error')); } diff --git a/public/login.php b/public/login.php index 501156e8..8ea06792 100644 --- a/public/login.php +++ b/public/login.php @@ -56,7 +56,7 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { $h = new AdminHandler(); - $login = new Login('admin', $h->getId_field()); + $login = new Login('admin'); if ($login->login($fUsername, $fPassword)) { init_session($fUsername, true); diff --git a/public/users/login.php b/public/users/login.php index c652c17f..f5019c7a 100644 --- a/public/users/login.php +++ b/public/users/login.php @@ -46,9 +46,7 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { # (language preference cookie is processed even if username and/or password are invalid) } - $h = new MailboxHandler(); - - $login = new Login('mailbox', 'username'); + $login = new Login('mailbox'); ; if ($login->login($fUsername, $fPassword)) { init_session($fUsername, false); diff --git a/public/users/password-recover.php b/public/users/password-recover.php index fc2ae556..1326a872 100644 --- a/public/users/password-recover.php +++ b/public/users/password-recover.php @@ -70,12 +70,10 @@ if ($_SERVER['REQUEST_METHOD'] === "POST") { $tUsername = escape_string($username); $table = $context === 'admin' ? 'admin' : 'mailbox'; - $login = new Login($table, 'username'); + $login = new Login($table); $token = $login->generatePasswordRecoveryCode($tUsername); - $handler = $context === 'admin' ? new AdminHandler : new MailboxHandler; - if ($token !== false) { $table = table_by_key($context === 'users' ? 'mailbox' : 'admin'); $row = db_query_one("SELECT * FROM $table WHERE username= :username", array('username' => $username)); diff --git a/public/users/password.php b/public/users/password.php index 4cf27032..e7e06066 100644 --- a/public/users/password.php +++ b/public/users/password.php @@ -57,9 +57,7 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { $error += 1; } - $mh = new MailboxHandler(); - - $login = new Login('mailbox', 'username'); + $login = new Login('mailbox'); if (!$login->login($username, $fPassword_current)) { $error += 1; diff --git a/public/xmlrpc.php b/public/xmlrpc.php index 5e0d47ad..cd397e09 100644 --- a/public/xmlrpc.php +++ b/public/xmlrpc.php @@ -45,8 +45,7 @@ $server = new Zend_XmlRpc_Server(); * @return boolean true on success, else false. */ function login($username, $password) { - $h = new MailboxHandler(); - $login = new Login('mailbox', 'username'); + $login = new Login('mailbox'); if ($login->login($username, $password)) { session_regenerate_id(); $_SESSION['authenticated'] = true; @@ -86,7 +85,7 @@ class UserProxy { return false; // user doesn't exist. } - $login = new Login('mailbox', 'username'); + $login = new Login('mailbox'); try { return $login->changePassword($username, $new_password, $old_password); @@ -101,7 +100,7 @@ class UserProxy { * @return boolean true if successful. */ public function login($username, $password) { - $login = new Login('mailbox', 'username'); + $login = new Login('mailbox'); return $login->login($username, $password); } } diff --git a/tests/LoginTest.php b/tests/LoginTest.php index bcb8845c..985c5655 100644 --- a/tests/LoginTest.php +++ b/tests/LoginTest.php @@ -32,7 +32,7 @@ VALUES(:username, :password, :name, :maildir, :local_part, :domain)", } public function testInvalidUsers() { - $login = new Login('mailbox', 'username'); + $login = new Login('mailbox'); $this->assertFalse($login->login('test', 'password')); $this->assertFalse($login->login('test', '')); @@ -41,7 +41,7 @@ VALUES(:username, :password, :name, :maildir, :local_part, :domain)", public function testValidLogin() { - $login = new Login('mailbox', 'username'); + $login = new Login('mailbox'); $this->assertFalse($login->login('test', 'password')); $this->assertFalse($login->login('test', 'foobar')); @@ -49,7 +49,7 @@ VALUES(:username, :password, :name, :maildir, :local_part, :domain)", } public function testPasswordRecovery() { - $login = new Login('mailbox', 'username'); + $login = new Login('mailbox'); $this->assertFalse($login->generatePasswordRecoveryCode('')); $this->assertFalse($login->generatePasswordRecoveryCode('doesnotexist')); $this->assertNotEmpty($login->generatePasswordRecoveryCode('test@example.com')); From e4d5e4bee0cc930a0b5658a778219e0eee35891c Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 26 Sep 2020 09:58:16 +0100 Subject: [PATCH 071/691] reformat --- model/Login.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/Login.php b/model/Login.php index 5bf1679b..f8d1523f 100644 --- a/model/Login.php +++ b/model/Login.php @@ -7,7 +7,7 @@ class Login { public function __construct(string $tableName) { $ok = ['mailbox', 'admin']; - if(!in_array($tableName, $ok)) { + if (!in_array($tableName, $ok)) { throw new \InvalidArgumentException("Unsupported tableName for login: " . $tableName); } $this->table = table_by_key($tableName); From 484acfbf59b8f49367bb64f1c1e6b3284714b5db Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sun, 27 Sep 2020 10:47:22 +0100 Subject: [PATCH 072/691] Remove the random_compat lib. --- common.php | 3 --- functions.inc.php | 4 ---- lib/block_random_int.php | 17 ----------------- lib/random_compat.phar.pubkey | 5 ----- lib/random_compat.txt | 4 ---- psalm.xml | 1 - 6 files changed, 34 deletions(-) delete mode 100644 lib/block_random_int.php delete mode 100644 lib/random_compat.phar.pubkey delete mode 100644 lib/random_compat.txt diff --git a/common.php b/common.php index daea0bad..5e93e225 100644 --- a/common.php +++ b/common.php @@ -68,9 +68,6 @@ Config::write($CONF); $PALANG = []; require_once("$incpath/languages/language.php"); require_once("$incpath/functions.inc.php"); -if (extension_loaded('Phar') && ( version_compare(PHP_VERSION, '7.0.0') < 0)) { - require_once("$incpath/lib/random_compat.phar"); -} if (defined('POSTFIXADMIN_CLI')) { $language = 'en'; # TODO: make configurable or autodetect from locale settings diff --git a/functions.inc.php b/functions.inc.php index e1400bff..3cafb2dc 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -834,10 +834,6 @@ function encode_header($string, $default_charset = "utf-8") { } -if (!function_exists('random_int')) { // PHP version < 7.0 - require_once(dirname(__FILE__) . '/lib/block_random_int.php'); -} - /** * Generate a random password of $length characters. diff --git a/lib/block_random_int.php b/lib/block_random_int.php deleted file mode 100644 index 5d6d9d0b..00000000 --- a/lib/block_random_int.php +++ /dev/null @@ -1,17 +0,0 @@ - - From 8abde0dc0b5615d88b66397c69abad7317cddc77 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sun, 27 Sep 2020 10:47:56 +0100 Subject: [PATCH 073/691] move $version into $CONF / Config from functions.inc.php --- config.inc.php | 2 ++ functions.inc.php | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config.inc.php b/config.inc.php index 97464412..f14c9760 100644 --- a/config.inc.php +++ b/config.inc.php @@ -692,6 +692,8 @@ $CONF['xmlrpc_enabled'] = false; //More details in README.password_expiration $CONF['password_expiration'] = 'YES'; +$CONF['version'] = '3.3-dev'; + // If you want to keep most settings at default values and/or want to ensure // that future updates work without problems, you can use a separate config // file (config.local.php) instead of editing this file and override some diff --git a/functions.inc.php b/functions.inc.php index 3cafb2dc..e8cc0ca2 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -14,7 +14,7 @@ * Contains re-usable code. */ -$version = '3.2'; + $min_db_version = 1840; # update (at least) before a release with the latest function numbrer in upgrade.php /** From 8bfe9fe66854a638ab05c5413e7f3b5d0394e049 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sun, 27 Sep 2020 10:49:58 +0100 Subject: [PATCH 074/691] Rejig PFASmarty, so it becomes a singleton accessible to the various 'controllers'. (PFASmarty::getInstance() ... stops a global variable at least). --- lib/PFASmarty.php | 89 ---------------------------------------------- lib/smarty.inc.php | 33 ----------------- public/edit.php | 2 ++ 3 files changed, 2 insertions(+), 122 deletions(-) delete mode 100644 lib/PFASmarty.php diff --git a/lib/PFASmarty.php b/lib/PFASmarty.php deleted file mode 100644 index 71bdd93a..00000000 --- a/lib/PFASmarty.php +++ /dev/null @@ -1,89 +0,0 @@ -template = new Smarty(); - - //$this->template->debugging = true; - if($template_theme == 'default') { - $this->template->setTemplateDir(dirname(__FILE__) . '/../templates'); - } - else { - $this->template->setTemplateDir(dirname(__FILE__) . '/../templates/'. $template_theme); - } - - // if it's not present or writeable, smarty should just not cache. - $templates_c = dirname(__FILE__) . '/../templates_c'; - if (is_dir($templates_c) && is_writeable($templates_c)) { - $this->template->setCompileDir($templates_c); - } else { - # unfortunately there's no sane way to just disable compiling of templates - clearstatcache(); // just incase someone just fixed it; on their next refresh it should work. - error_log("ERROR: directory $templates_c doesn't exist or isn't writeable for the webserver"); - die("ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver"); - } - - $this->template->setConfigDir(dirname(__FILE__) . '/../configs'); - } - - /** - * @param string $key - * @param mixed $value - * @param bool $sanitise - */ - public function assign($key, $value, $sanitise = true) { - $this->template->assign("RAW_$key", $value); - if ($sanitise == false) { - return $this->template->assign($key, $value); - } - $clean = $this->sanitise($value); - /* we won't run the key through sanitise() here... some might argue we should */ - return $this->template->assign($key, $clean); - } - - /** - * @return void - * @param string $template - */ - public function display($template) { - header("Expires: Sun, 16 Mar 2003 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - header("Content-Type: text/html; charset=UTF-8"); - - $this->template->display($template); - unset($_SESSION['flash']); # cleanup flash messages - } - /** - * Recursive cleaning of data, using htmlentities - this assumes we only ever output to HTML and we're outputting in UTF-8 charset - * - * @param mixed $data - array or primitive type; objects not supported. - * @return mixed $data - * */ - public function sanitise($data) { - if (!is_array($data)) { - return htmlentities($data, ENT_QUOTES, 'UTF-8', false); - } - $clean = array(); - foreach ($data as $key => $value) { - /* as this is a nested data structure it's more likely we'll output the key too (at least in my opinion, so we'll sanitise it too */ - $clean[$this->sanitise($key)] = $this->sanitise($value); - } - return $clean; - } -} - diff --git a/lib/smarty.inc.php b/lib/smarty.inc.php index 818ad04a..4233cf96 100644 --- a/lib/smarty.inc.php +++ b/lib/smarty.inc.php @@ -6,38 +6,5 @@ if (!isset($CONF) || !isset($PALANG)) { require_once(dirname(__FILE__) . '/smarty/libs/Autoloader.php'); -require_once(dirname(__FILE__) . '/PFASmarty.php'); Smarty_Autoloader::register(); - -if (isset($CONF['theme']) && is_dir(dirname(__FILE__) . "/../templates/" . $CONF['theme'])) { - $smarty = new PFASmarty($CONF['theme']); -} else { - $smarty = new PFASmarty(); -} - -if (!isset($rel_path)) { - $rel_path = ''; -} # users/* sets this to '../' - -$CONF['theme_css'] = $rel_path . htmlentities($CONF['theme_css']); -if (!empty($CONF['theme_custom_css'])) { - $CONF['theme_custom_css'] = $rel_path . htmlentities($CONF['theme_custom_css']); -} -$CONF['theme_favicon'] = $rel_path . htmlentities($CONF['theme_favicon']); -$CONF['theme_logo'] = $rel_path . htmlentities($CONF['theme_logo']); - -$smarty->assign('CONF', $CONF); -$smarty->assign('PALANG', $PALANG); -$smarty->assign('url_domain', ''); -//*** footer.tpl -if (!isset($version)) { - $version = 'dev/unknown'; -} -$smarty->assign('version', $version); - -//*** menu.tpl -$smarty->assign('boolconf_alias_domain', Config::bool('alias_domain')); -$smarty->assign('authentication_has_role', array('global_admin' => authentication_has_role('global-admin'), 'admin' => authentication_has_role('admin'), 'user' => authentication_has_role('user'))); - -/* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */ diff --git a/public/edit.php b/public/edit.php index 11a7fe35..8aae2372 100644 --- a/public/edit.php +++ b/public/edit.php @@ -24,6 +24,8 @@ require_once('common.php'); +$smarty = PFASmarty::getInstance(); + $username = authentication_get_username(); # enforce login $table = safepost('table', safeget('table')); From 290afa14730fd3fa71f118c7aa1e313b4fab6285 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sun, 27 Sep 2020 10:52:03 +0100 Subject: [PATCH 075/691] should be gone --- lib/random_compat.phar | Bin 48203 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/random_compat.phar diff --git a/lib/random_compat.phar b/lib/random_compat.phar deleted file mode 100644 index 781c1f00aafd3ce5fcaffe63bb69b88bcc0c16a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48203 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 Date: Sun, 27 Sep 2020 10:52:19 +0100 Subject: [PATCH 076/691] allow the template to be destroyed --- model/PFASmarty.php | 137 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 model/PFASmarty.php diff --git a/model/PFASmarty.php b/model/PFASmarty.php new file mode 100644 index 00000000..efe7596b --- /dev/null +++ b/model/PFASmarty.php @@ -0,0 +1,137 @@ +getAll(); + + if (isset($CONF['theme']) && is_dir(dirname(__FILE__) . "/../templates/" . $CONF['theme'])) { + $smarty = new PFASmarty($CONF['theme']); + } else { + $smarty = new PFASmarty(); + } + + $smarty->configureTheme('');// default to something. + + $smarty->assign('CONF', $CONF); + $smarty->assign('PALANG', $CONF['__PALANG'] ?? []); + $smarty->assign('url_domain', ''); + + $smarty->assign('version', $CONF['version'] ?? 'unknown'); + + $smarty->assign('boolconf_alias_domain', Config::bool('alias_domain')); + $smarty->assign('authentication_has_role', array('global_admin' => authentication_has_role('global-admin'), 'admin' => authentication_has_role('admin'), 'user' => authentication_has_role('user'))); + + return $smarty; + } + + /** + * @param string $rel_path - relative path for referenced css etc dependencies - e.g. users/edit.php needs '../' else, it's ''. + */ + public function configureTheme(string $rel_path = '') { + $CONF = Config::getInstance()->getAll(); + + $CONF['theme_css'] = $rel_path . htmlentities($CONF['theme_css']); + if (!empty($CONF['theme_custom_css'])) { + $CONF['theme_custom_css'] = $rel_path . htmlentities($CONF['theme_custom_css']); + } + $CONF['theme_favicon'] = $rel_path . htmlentities($CONF['theme_favicon']); + $CONF['theme_logo'] = $rel_path . htmlentities($CONF['theme_logo']); + + $this->assign('CONF', $CONF); + } + + /** + * @var Smarty + */ + protected $template; + + /** + * @param string $template_theme + */ + public function __construct($template_theme = 'default') { + $this->template = new Smarty(); + + //$this->template->debugging = true; + if ($template_theme == 'default') { + $this->template->setTemplateDir(dirname(__FILE__) . '/../templates'); + } else { + $this->template->setTemplateDir(dirname(__FILE__) . '/../templates/' . $template_theme); + } + + // if it's not present or writeable, smarty should just not cache. + $templates_c = dirname(__FILE__) . '/../templates_c'; + if (is_dir($templates_c) && is_writeable($templates_c)) { + $this->template->setCompileDir($templates_c); + } else { + # unfortunately there's no sane way to just disable compiling of templates + clearstatcache(); // just incase someone just fixed it; on their next refresh it should work. + error_log("ERROR: directory $templates_c doesn't exist or isn't writeable for the webserver"); + die("ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver"); + } + + $this->template->setConfigDir(dirname(__FILE__) . '/../configs'); + } + + /** + * @param string $key + * @param mixed $value + * @param bool $sanitise + */ + public function assign($key, $value, $sanitise = true) { + $this->template->assign("RAW_$key", $value); + if ($sanitise == false) { + return $this->template->assign($key, $value); + } + $clean = $this->sanitise($value); + /* we won't run the key through sanitise() here... some might argue we should */ + return $this->template->assign($key, $clean); + } + + /** + * @param string $template + * @return void + */ + public function display($template) { + header("Expires: Sun, 16 Mar 2003 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + header("Content-Type: text/html; charset=UTF-8"); + + $this->template->display($template); + unset($_SESSION['flash']); # cleanup flash messages + } + + /** + * Recursive cleaning of data, using htmlentities - this assumes we only ever output to HTML and we're outputting in UTF-8 charset + * + * @param mixed $data - array or primitive type; objects not supported. + * @return mixed $data + * */ + public function sanitise($data) { + if (!is_array($data)) { + return htmlentities($data, ENT_QUOTES, 'UTF-8', false); + } + $clean = array(); + foreach ($data as $key => $value) { + /* as this is a nested data structure it's more likely we'll output the key too (at least in my opinion, so we'll sanitise it too */ + $clean[$this->sanitise($key)] = $this->sanitise($value); + } + return $clean; + } +} From f6f62180e8e1c30f4ebb39155223b469c0b4ba19 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sun, 27 Sep 2020 11:02:58 +0100 Subject: [PATCH 077/691] remove some global variables --- public/backup.php | 3 +++ public/broadcast-message.php | 3 +++ public/list-virtual.php | 3 +++ public/list.php | 3 +++ public/login.php | 3 +++ public/main.php | 4 ++++ public/sendmail.php | 4 ++++ public/users/password-change.php | 5 +++++ public/users/password-recover.php | 3 +++ public/vacation.php | 3 +++ public/viewlog.php | 6 ++++++ 11 files changed, 40 insertions(+) diff --git a/public/backup.php b/public/backup.php index 900fd091..d8df1a77 100644 --- a/public/backup.php +++ b/public/backup.php @@ -24,6 +24,9 @@ require_once('common.php'); authentication_require_role('global-admin'); +$CONF = Config::getInstance()->getAll(); +$smarty = PFASmarty::getInstance(); + (($CONF['backup'] == 'NO') ? header("Location: main.php") && exit : '1'); // TODO: make backup supported for postgres diff --git a/public/broadcast-message.php b/public/broadcast-message.php index f3ed90ac..9dc7de1e 100644 --- a/public/broadcast-message.php +++ b/public/broadcast-message.php @@ -33,6 +33,9 @@ if (Config::bool('sendmail_all_admins')) { authentication_require_role('global-admin'); } +$CONF = Config::getInstance()->getAll(); +$smarty = PFASmarty::getInstance(); + if ($CONF['sendmail'] != 'YES') { header("Location: main.php"); exit; diff --git a/public/list-virtual.php b/public/list-virtual.php index 2d66fad0..bbd053ba 100644 --- a/public/list-virtual.php +++ b/public/list-virtual.php @@ -31,6 +31,9 @@ $admin_username = authentication_get_username(); $list_domains = list_domains_for_admin($admin_username); +$CONF = Config::getInstance()->getAll(); +$smarty = PFASmarty::getInstance(); + $page_size = $CONF['page_size']; $fDomain = safepost('fDomain', safeget('domain', safesession('list-virtual:domain'))); diff --git a/public/list.php b/public/list.php index 030da1ba..f2b4f0e1 100644 --- a/public/list.php +++ b/public/list.php @@ -21,6 +21,9 @@ require_once('common.php'); $username = authentication_get_username(); # enforce login +$CONF = Config::getInstance()->getAll(); +$smarty = PFASmarty::getInstance(); + $table = safeget('table'); if (!is_string($table)) { diff --git a/public/login.php b/public/login.php index 8ea06792..7b547213 100644 --- a/public/login.php +++ b/public/login.php @@ -29,6 +29,9 @@ require_once('common.php'); +$CONF = Config::getInstance()->getAll(); +$smarty = PFASmarty::getInstance(); + if ($CONF['configured'] !== true) { print "Installation not yet configured; please edit config.inc.php or write your settings to config.local.php"; exit; diff --git a/public/main.php b/public/main.php index 2f399847..a2460da2 100644 --- a/public/main.php +++ b/public/main.php @@ -25,6 +25,10 @@ require_once('common.php'); $SESSID_USERNAME = authentication_get_username(); authentication_require_role('admin'); + +$CONF = Config::getInstance()->getAll(); +$smarty = PFASmarty::getInstance(); + $smarty->assign('smarty_template', 'main'); $smarty->display('index.tpl'); diff --git a/public/sendmail.php b/public/sendmail.php index d070bc20..284f1e10 100644 --- a/public/sendmail.php +++ b/public/sendmail.php @@ -32,6 +32,10 @@ require_once('common.php'); authentication_require_role('admin'); +$CONF = Config::getInstance()->getAll(); +$smarty = PFASmarty::getInstance(); +$PALANG = $CONF['__LANG']; + (($CONF['sendmail'] == 'NO') ? header("Location: main.php") && exit : '1'); $smtp_from_email = smtp_get_admin_email(); diff --git a/public/users/password-change.php b/public/users/password-change.php index 2085da34..d089e5b7 100644 --- a/public/users/password-change.php +++ b/public/users/password-change.php @@ -34,6 +34,11 @@ if (preg_match('/\/users\//', $_SERVER['REQUEST_URI'])) { } require_once($rel_path . 'common.php'); +$CONF = Config::getInstance()->getAll(); +$smarty = PFASmarty::getInstance(); + +$smarty->configureTheme($rel_path); + if ($context === 'admin' && !Config::read('forgotten_admin_password_reset') || $context === 'users' && !Config::read('forgotten_user_password_reset')) { die('Password reset is disabled by configuration option: forgotten_admin_password_reset'); } diff --git a/public/users/password-recover.php b/public/users/password-recover.php index 1326a872..427dbd69 100644 --- a/public/users/password-recover.php +++ b/public/users/password-recover.php @@ -25,6 +25,7 @@ */ +/* if in .../users, we need to load a different common.php; not this file is symlinked with public/ */ if (preg_match('/\/users\//', $_SERVER['REQUEST_URI'])) { $rel_path = '../'; $context = 'users'; @@ -34,6 +35,8 @@ if (preg_match('/\/users\//', $_SERVER['REQUEST_URI'])) { } require_once($rel_path . 'common.php'); + + if ($context === 'admin' && !Config::read('forgotten_admin_password_reset') || $context === 'users' && !Config::read('forgotten_user_password_reset')) { die('Password reset is disabled by configuration option: forgotten_admin_password_reset'); } diff --git a/public/vacation.php b/public/vacation.php index 36661734..1bd9c28e 100644 --- a/public/vacation.php +++ b/public/vacation.php @@ -39,6 +39,9 @@ require_once('common.php'); +$CONF = Config::getInstance()->getAll(); +$smarty = PFASmarty::getInstance(); + // only allow admins to change someone else's 'stuff' if (authentication_has_role('admin')) { $Admin_role = 1 ; diff --git a/public/viewlog.php b/public/viewlog.php index 2c985146..adb56199 100644 --- a/public/viewlog.php +++ b/public/viewlog.php @@ -28,6 +28,12 @@ require_once('common.php'); authentication_require_role('admin'); + +$CONF = Config::getInstance()->getAll(); +$smarty = PFASmarty::getInstance(); + +$PALANG = $CONF['__LANG']; + $SESSID_USERNAME = authentication_get_username(); if (authentication_has_role('global-admin')) { $list_domains = list_domains(); From 6a82063f41598c94fec9cd933070a98419c82c5d Mon Sep 17 00:00:00 2001 From: Christian Boltz Date: Sun, 27 Sep 2020 19:30:35 +0200 Subject: [PATCH 078/691] Remove white background around postbox ... so that it better fits on the light grey background in the bootstrap theme. --- public/images/postbox.png | Bin 4361 -> 2837 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/postbox.png b/public/images/postbox.png index ea830bfb898e21400042d20ac7db62d10fb1a83f..910fd7051171be5331a3983ba89edf5c456f8986 100644 GIT binary patch delta 2824 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 From a3386ee8f7e489c7aad10cf79b19f8c4ea89d513 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sun, 27 Sep 2020 20:41:25 +0100 Subject: [PATCH 079/691] change alias/mailbox deletion to be a POST request --- public/delete.php | 7 ++++--- templates/bootstrap/list-virtual_mailbox.tpl | 12 ++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/public/delete.php b/public/delete.php index 0bc6c194..e13eb026 100644 --- a/public/delete.php +++ b/public/delete.php @@ -19,14 +19,15 @@ require_once('common.php'); -if (safeget('token') != $_SESSION['PFA_token']) { + +if (safepost('token') != $_SESSION['PFA_token']) { die('Invalid token!'); } $username = authentication_get_username(); # enforce login -$id = safeget('delete'); -$table = safeget('table'); +$id = safepost('delete'); +$table = safepost('table'); $handlerclass = ucfirst($table) . 'Handler'; diff --git a/templates/bootstrap/list-virtual_mailbox.tpl b/templates/bootstrap/list-virtual_mailbox.tpl index 94b7cb8e..353fa6e6 100644 --- a/templates/bootstrap/list-virtual_mailbox.tpl +++ b/templates/bootstrap/list-virtual_mailbox.tpl @@ -98,8 +98,16 @@ {$PALANG.alias} {/if} {$PALANG.edit} - {$PALANG.del} + +
    + + + + +
    + {/foreach} From 0922db8210d50d57eebf82aaf4f5c419ce03a59f Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sun, 27 Sep 2020 20:44:03 +0100 Subject: [PATCH 080/691] change deletion to be a POST request, use btn-danger etc --- templates/bootstrap/list.tpl | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/templates/bootstrap/list.tpl b/templates/bootstrap/list.tpl index 6eaa2d2d..73e451f4 100644 --- a/templates/bootstrap/list.tpl +++ b/templates/bootstrap/list.tpl @@ -82,7 +82,7 @@ *} {elseif $key == 'active'} {if $item._can_edit} - {$item._active} + {$item._active} {else} {$item._active} {/if} @@ -99,7 +99,7 @@ {assign var="quota_level" value="high"} {elseif $item[$tmpkey]>55} {assign var="quota_level" value="mid"} - {else} + {else} {assign var="quota_level" value="low"} {/if} {if $item[$tmpkey] > -1} @@ -123,9 +123,23 @@ {/if} {/foreach} - {if $item._can_edit}{$PALANG.edit}{else} {/if} - {if $item._can_delete}{$PALANG.del}{else} {/if} + {if $item._can_edit} + {$PALANG.edit} + {else}  + {/if} + + {if $item._can_delete} +
    + + + + + +
    + {else} {/if} + {/foreach} From 36d747832efcdfde623c12e7e6101bbdd7df3ad1 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sun, 27 Sep 2020 20:45:53 +0100 Subject: [PATCH 081/691] reindent some html --- templates/bootstrap/editform.tpl | 148 ++++++++------- templates/bootstrap/flash_error.tpl | 42 ++--- templates/bootstrap/footer.tpl | 30 +-- templates/bootstrap/header.tpl | 44 ++--- templates/bootstrap/index.tpl | 51 ++--- templates/bootstrap/list-virtual.tpl | 197 +++++++++++--------- templates/bootstrap/login.tpl | 106 ++++++----- templates/bootstrap/main.tpl | 64 +++---- templates/bootstrap/menu.tpl | 226 ++++++++++++----------- templates/bootstrap/password-change.tpl | 53 +++--- templates/bootstrap/password-recover.tpl | 48 ++--- templates/bootstrap/password.tpl | 70 +++---- templates/bootstrap/sendmail.tpl | 60 +++--- templates/bootstrap/users_edit-alias.tpl | 70 +++---- templates/bootstrap/users_main.tpl | 46 ++--- templates/bootstrap/users_menu.tpl | 53 +++--- templates/bootstrap/vacation.tpl | 162 ++++++++-------- templates/bootstrap/viewlog.tpl | 64 +++---- 18 files changed, 798 insertions(+), 736 deletions(-) diff --git a/templates/bootstrap/editform.tpl b/templates/bootstrap/editform.tpl index c0e8ae83..a5e0fd1a 100644 --- a/templates/bootstrap/editform.tpl +++ b/templates/bootstrap/editform.tpl @@ -1,84 +1,80 @@
    -
    -

    {$formtitle}

    -
    - - +
    +

    {$formtitle}

    +
    + + -{foreach key=key item=field from=$struct} - {if $field.display_in_form == 1} + {foreach key=key item=field from=$struct} + {if $field.display_in_form == 1} - {if $table == 'foo' && $key == 'bar'} -
    Special handling (complete table row) for {$table} / {$key}
    - {else} -
    - -
    - {if $field.editable == 0} - {if $field.type == 'enma'} - {$struct.{$key}.options.{$value_{$key}}} - {else} - {$value_{$key}} - {/if} - {else} - {if $table == 'foo' && $key == 'bar'} - Special handling (td content) for {$table} / {$key} - {elseif $field.type == 'bool'} -
    - {elseif $field.type == 'enum'} - - {elseif $field.type == 'enma'} - - {elseif $field.type == 'list'} - + {if $table == 'foo' && $key == 'bar'} +
    Special handling (complete table row) for {$table} / {$key}
    + {else} +
    + +
    + {if $field.editable == 0} + {if $field.type == 'enma'} + {$struct.{$key}.options.{$value_{$key}}} + {else} + {$value_{$key}} + {/if} + {else} + {if $table == 'foo' && $key == 'bar'} + Special handling (td content) for {$table} / {$key} + {elseif $field.type == 'bool'} +
    + {elseif $field.type == 'enum'} + + {elseif $field.type == 'enma'} + + {elseif $field.type == 'list'} + + {elseif $field.type == 'pass' || $field.type == 'b64p'} + + {elseif $field.type == 'txtl'} + + {else} + + {/if} + {/if} - - {elseif $field.type == 'pass' || $field.type == 'b64p'} - - {elseif $field.type == 'txtl'} - - {else} - - {/if} - {/if} + {if $table == 'foo' && $key == 'bar'} + Special handling (td content) for {$table} / {$key} + {else} + {if $fielderror.{$key}} + {$fielderror.{$key}} + {else} + {$field.desc} + {/if} + {/if} +
    +
    + {/if} - {if $table == 'foo' && $key == 'bar'} - Special handling (td content) for {$table} / {$key} - {else} - {if $fielderror.{$key}} - {$fielderror.{$key}} - {else} - {$field.desc} - {/if} - {/if} -
    -
    - {/if} + {/if} + {/foreach} - {/if} -{/foreach} +
    + -
    - - -
    +
    diff --git a/templates/bootstrap/flash_error.tpl b/templates/bootstrap/flash_error.tpl index 1f91df49..627a35f0 100644 --- a/templates/bootstrap/flash_error.tpl +++ b/templates/bootstrap/flash_error.tpl @@ -1,24 +1,24 @@ -

    +

    {strip} - {if isset($smarty.session.flash)} - {if isset($smarty.session.flash.info)} - - {/if} - {if isset($smarty.session.flash.error)} - - {/if} - {/if} + {if isset($smarty.session.flash)} + {if isset($smarty.session.flash.info)} + + {/if} + {if isset($smarty.session.flash.error)} + + {/if} + {/if} {/strip} diff --git a/templates/bootstrap/footer.tpl b/templates/bootstrap/footer.tpl index 6c38c053..97562584 100644 --- a/templates/bootstrap/footer.tpl +++ b/templates/bootstrap/footer.tpl @@ -1,20 +1,22 @@
    -
    - Postfix Admin {$version} -    |    - {$PALANG.check_update} - {if isset($smarty.session.sessid)} - {if $smarty.session.sessid.username} -    |    - {$PALANG.pFooter_logged_as|replace:"%s":$smarty.session.sessid.username} +
    + Postfix Admin {$version} +    |    + {$PALANG.check_update} + + {if isset($smarty.session.sessid)} + {if $smarty.session.sessid.username} +    |    + {$PALANG.pFooter_logged_as|replace:"%s":$smarty.session.sessid.username} + {/if} {/if} - {/if} - {if $CONF.show_footer_text == 'YES' && $CONF.footer_link} -    |    - {$CONF.footer_text} - {/if} -
    + {if $CONF.show_footer_text == 'YES' && $CONF.footer_link} +    |    + {$CONF.footer_text} + {/if} +
    diff --git a/templates/bootstrap/header.tpl b/templates/bootstrap/header.tpl index 6760cf7f..d68edb78 100644 --- a/templates/bootstrap/header.tpl +++ b/templates/bootstrap/header.tpl @@ -1,31 +1,21 @@ - - - - - + + + + + - Postfix Admin - {$smarty.server.HTTP_HOST} - - - {if $CONF.theme_custom_css} - - {/if} - - - - - - - {*** -
    -
    - -{if $CONF.show_header_text==='YES' && $CONF.header_text} -

    {$CONF.header_text}

    -{/if} -

    test

    -
    - ***} + Postfix Admin - {$smarty.server.HTTP_HOST} + + + {if $CONF.theme_custom_css} + + {/if} + + + + + + diff --git a/templates/bootstrap/index.tpl b/templates/bootstrap/index.tpl index 0d178e23..9a272d2b 100644 --- a/templates/bootstrap/index.tpl +++ b/templates/bootstrap/index.tpl @@ -1,29 +1,30 @@ {strip} -{include file="header.tpl"} -{if $smarty_template !== 'login' && $smarty_template !== 'password-recover' && $smarty_template !== 'password-change'} - {config_load file="menu.conf" section=$smarty_template} - {if $authentication_has_role.user} - {include file='users_menu.tpl'} - {else} - {include file='menu.tpl'} - {/if} -{/if} -
    -{if $authentication_has_role.user && $CONF.motd_user} -
    {$CONF.motd_user}
    -{elseif $authentication_has_role.global_admin && $CONF.motd_superadmin} -
    {$CONF.motd_superadmin}
    -{elseif $authentication_has_role.admin && $CONF.motd_admin} -
    {$CONF.motd_admin}
    -{/if} + {include file="header.tpl"} + {if $smarty_template !== 'login' && $smarty_template !== 'password-recover' && $smarty_template !== 'password-change'} + {config_load file="menu.conf" section=$smarty_template} + {if $authentication_has_role.user} + {include file='users_menu.tpl'} + {else} + {include file='menu.tpl'} + {/if} + {/if} +
    + {if $authentication_has_role.user && $CONF.motd_user} +
    {$CONF.motd_user}
    + {elseif $authentication_has_role.global_admin && $CONF.motd_superadmin} +
    {$CONF.motd_superadmin}
    + {elseif $authentication_has_role.admin && $CONF.motd_admin} +
    {$CONF.motd_admin}
    + {/if} -{include file='flash_error.tpl'} -{if $smarty_template} - {include file="$smarty_template.tpl"} -{else} -

    Template not found

    ({$smarty.server.PHP_SELF|escape:"html"}) -{/if} -
    -{include file='footer.tpl'} + {include file='flash_error.tpl'} + {if $smarty_template} + {include file="$smarty_template.tpl"} + {else} +

    Template not found

    + ({$smarty.server.PHP_SELF|escape:"html"}) + {/if} +
    + {include file='footer.tpl'} {/strip} diff --git a/templates/bootstrap/list-virtual.tpl b/templates/bootstrap/list-virtual.tpl index 8cfc2778..61460654 100644 --- a/templates/bootstrap/list-virtual.tpl +++ b/templates/bootstrap/list-virtual.tpl @@ -1,101 +1,126 @@ {assign var="file" value=$smarty.config.url_list_virtual}
    -
    -
    -
    - {html_options name='domain' class='form-control' output=$domain_list values=$domain_list selected=$domain_selected onchange="this.form.submit();"} - - -
    -
    -
    {#form_search#}
    -
    -
    -
    -{if isset($search._)} -

    {$PALANG.pSearch_welcome} {$search._}

    -{else} -

    {$PALANG.pOverview_welcome}{$fDomain} :

    -
      -
    • {$PALANG.aliases}: {$limit.alias_count} / {$limit.aliases}
    • -
    • {$PALANG.mailboxes}: {$limit.mailbox_count} / {$limit.mailboxes}
    • -
    -{/if} -
    -
    -
    {$PALANG.show} - {if isset($search._)} - {assign var="searchsuffix" value="&search[_]={$search._}"} - {else} - {assign var="searchsuffix" value=""} - {/if} +
    +
    +
    +
    + {html_options name='domain' class='form-control' output=$domain_list values=$domain_list selected=$domain_selected onchange="this.form.submit();"} + + +
    +
    +
    {#form_search#}
    +
    +
    +
    +
    + {if isset($search._)} +

    {$PALANG.pSearch_welcome} {$search._}

    + {else} +

    {$PALANG.pOverview_welcome}{$fDomain} :

    +
      +
    • {$PALANG.aliases}: {$limit.alias_count} / {$limit.aliases}
    • +
    • {$PALANG.mailboxes}: {$limit.mailbox_count} / {$limit.mailboxes}
    • +
    + {/if} +
    +
    +
    +
    {$PALANG.show} + {if isset($search._)} + {assign var="searchsuffix" value="&search[_]={$search._}"} + {else} + {assign var="searchsuffix" value=""} + {/if} - {if $tab=='all'}{$PALANG.all} - {else}{$PALANG.all}{/if} - {if $tab=='mailbox'}{$PALANG.pOverview_mailbox_title} - {else}{$PALANG.pOverview_mailbox_title}{/if} - {if $tab=='alias'}{$PALANG.pOverview_alias_title} - {else}{$PALANG.pOverview_alias_title}{/if} - {if $boolconf_alias_domain} - {if $tab=='alias_domain'}{$PALANG.pOverview_alias_domain_title} - {else}{$PALANG.pOverview_alias_domain_title}{/if} - {/if} -
    -
    + {if $tab=='all'}{$PALANG.all} + {else}{$PALANG.all}{/if} + {if $tab=='mailbox'}{$PALANG.pOverview_mailbox_title} + {else}{$PALANG.pOverview_mailbox_title}{/if} + {if $tab=='alias'}{$PALANG.pOverview_alias_title} + {else}{$PALANG.pOverview_alias_title}{/if} + {if $boolconf_alias_domain} + {if $tab=='alias_domain'}{$PALANG.pOverview_alias_domain_title} + {else}{$PALANG.pOverview_alias_domain_title}{/if} + {/if} +
    +
    +

    {*** Domain Aliases ***} {if $boolconf_alias_domain} - {if $tab=='alias_domain' || $tab=='all'} - {include file="list-virtual_alias_domain.tpl"} - {/if} + {if $tab=='alias_domain' || $tab=='all'} + {include file="list-virtual_alias_domain.tpl"} + {/if} +{/if} +{if $tab=='all'} +
    +
    {/if} -{if $tab=='all'}

    {/if} {*** Aliases ***} {if $tab=='alias' || $tab=='all'} - {$nav_bar_alias.top} - {include file="list-virtual_alias.tpl"} - {$nav_bar_alias.bottom} + {$nav_bar_alias.top} + {include file="list-virtual_alias.tpl"} + {$nav_bar_alias.bottom} +{/if} +{if $tab=='all'} +
    +
    {/if} -{if $tab=='all'}

    {/if} {if $tab=='mailbox' || $tab=='all'} -
    - {$nav_bar_mailbox.top} - {assign var="colspan" value=9} - {if $CONF.vacation_control_admin===YES}{assign var="colspan" value="`$colspan+1`"}{/if} - {if $CONF.alias_control_admin===YES}{assign var="colspan" value="`$colspan+1`"}{/if} - - - - - - - {if $tMailbox} - {include file="list-virtual_mailbox.tpl"} - {else}
    {$PALANG.pOverview_mailbox_title}
    - {/if} - -
    +
    + {$nav_bar_mailbox.top} + {assign var="colspan" value=9} + {if $CONF.vacation_control_admin===YES}{assign var="colspan" value="`$colspan+1`"}{/if} + {if $CONF.alias_control_admin===YES}{assign var="colspan" value="`$colspan+1`"}{/if} + + + + + + + {if $tMailbox} + {include file="list-virtual_mailbox.tpl"} + {else}
    {$PALANG.pOverview_mailbox_title}
    + {/if} + +
    {/if} {if $CONF.show_status===YES && $CONF.show_status_key===YES} -

    - {if $CONF.show_undeliverable===YES} -  {$CONF.show_status_text}={$PALANG.pStatus_undeliverable} - {/if} - {if $CONF.show_popimap===YES} -  {$CONF.show_status_text}={$PALANG.pStatus_popimap} - {/if} - {if $CONF.show_custom_domains|@count>0} - {foreach from=$CONF.show_custom_domains item=item key=i} -  {$CONF.show_status_text}={$PALANG.pStatus_custom}{$item} - {/foreach} - {/if} +
    +
    + {if $CONF.show_undeliverable===YES} +   + {$CONF.show_status_text} + ={$PALANG.pStatus_undeliverable} + {/if} + {if $CONF.show_popimap===YES} +   + {$CONF.show_status_text} + ={$PALANG.pStatus_popimap} + {/if} + {if $CONF.show_custom_domains|@count>0} + {foreach from=$CONF.show_custom_domains item=item key=i} +   + {$CONF.show_status_text} + ={$PALANG.pStatus_custom}{$item} + {/foreach} + {/if} {/if} diff --git a/templates/bootstrap/login.tpl b/templates/bootstrap/login.tpl index 68a1e578..090dadf9 100644 --- a/templates/bootstrap/login.tpl +++ b/templates/bootstrap/login.tpl @@ -1,57 +1,61 @@
    -

    {if $logintype=='admin'}{$PALANG.pLogin_welcome} -{else}{$PALANG.pUsersLogin_welcome} -{/if}

    -
    - -{if $logintype == 'admin'} -
    - -{/if} -
    -{literal} - -{/literal} +

    {if $logintype=='admin'}{$PALANG.pLogin_welcome} + {else}{$PALANG.pUsersLogin_welcome} + {/if}

    +
    + + {if $logintype == 'admin'} +
    + + {/if} +
    + {literal} + + {/literal}
    diff --git a/templates/bootstrap/main.tpl b/templates/bootstrap/main.tpl index d79dd469..4dd00a9d 100644 --- a/templates/bootstrap/main.tpl +++ b/templates/bootstrap/main.tpl @@ -1,36 +1,36 @@ diff --git a/templates/bootstrap/menu.tpl b/templates/bootstrap/menu.tpl index 4d27c4a3..2248359f 100644 --- a/templates/bootstrap/menu.tpl +++ b/templates/bootstrap/menu.tpl @@ -1,109 +1,129 @@ {strip} -{if !empty($smarty.get) && !empty($smarty.get.domain)} -{*** zuweisung muss eleganter gehen ***} - {assign var="url_domain" value=$smarty.get.domain} - {assign var="url_domain" value="&domain={$url_domain|escape:url}"} -{/if} + {if !empty($smarty.get) && !empty($smarty.get.domain)} + {*** zuweisung muss eleganter gehen ***} + {assign var="url_domain" value=$smarty.get.domain} + {assign var="url_domain" value="&domain={$url_domain|escape:url}"} + {/if} {/strip} {strip} - + {/strip} diff --git a/templates/bootstrap/password-change.tpl b/templates/bootstrap/password-change.tpl index 1c7e99f9..10293236 100644 --- a/templates/bootstrap/password-change.tpl +++ b/templates/bootstrap/password-change.tpl @@ -1,28 +1,29 @@
    -
    - - - - - - - - - - - - - - - - - - - - - - - -

    {$PALANG.pPassword_welcome}

    {$PALANG.pLogin_username} :
    {$PALANG.pPassword_password_code} :
    {$PALANG.pPassword_password} :
    {$PALANG.pPassword_password2} :
    -
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    {$PALANG.pPassword_welcome}

    {$PALANG.pLogin_username} :
    {$PALANG.pPassword_password_code} :
    {$PALANG.pPassword_password} :
    {$PALANG.pPassword_password2} :
    +
    diff --git a/templates/bootstrap/password-recover.tpl b/templates/bootstrap/password-recover.tpl index ebe0b017..5ab378b2 100644 --- a/templates/bootstrap/password-recover.tpl +++ b/templates/bootstrap/password-recover.tpl @@ -1,26 +1,26 @@
    -
    - - - - - - - - - - - - -
    {$PALANG.pPassword_recovery_title}
      - -
    -
    -{literal} - -{/literal} +
    + + + + + + + + + + + + +
    {$PALANG.pPassword_recovery_title}
      + +
    +
    + {literal} + + {/literal}
    diff --git a/templates/bootstrap/password.tpl b/templates/bootstrap/password.tpl index 0ba02c14..620f3b97 100644 --- a/templates/bootstrap/password.tpl +++ b/templates/bootstrap/password.tpl @@ -1,36 +1,40 @@
    -
    -

    {$PALANG.pPassword_welcome}

    -
    - -
    - -

    {$SESSID_USERNAME}

    -
    -
    - -
    - {$pPassword_password_current_text} -
    -
    - -
    - {$pPassword_password_text} -
    -
    - -
    -
    -
    - diff --git a/templates/bootstrap/sendmail.tpl b/templates/bootstrap/sendmail.tpl index d88e1d33..b97ff029 100644 --- a/templates/bootstrap/sendmail.tpl +++ b/templates/bootstrap/sendmail.tpl @@ -1,31 +1,33 @@
    -
    -

    {$PALANG.pSendmail_welcome}

    -
    - -
    - -

    {$smtp_from_email}

    -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    +
    +

    {$PALANG.pSendmail_welcome}

    +
    + +
    + +

    {$smtp_from_email}

    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    diff --git a/templates/bootstrap/users_edit-alias.tpl b/templates/bootstrap/users_edit-alias.tpl index fa07e309..1d267605 100644 --- a/templates/bootstrap/users_edit-alias.tpl +++ b/templates/bootstrap/users_edit-alias.tpl @@ -1,48 +1,50 @@
    -
    -

    {$PALANG.pEdit_alias_welcome}

    -
    - -

    {$PALANG.pEdit_alias_help}

    -
    +
    +

    {$PALANG.pEdit_alias_welcome}

    +
    + +

    {$PALANG.pEdit_alias_help}

    +

    {$USERID_USERNAME}

    -
    -
    +
    +
    -
    -
    -
    +
    +
    +
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    + +
    diff --git a/templates/bootstrap/users_main.tpl b/templates/bootstrap/users_main.tpl index a4310aa8..e07a6b16 100644 --- a/templates/bootstrap/users_main.tpl +++ b/templates/bootstrap/users_main.tpl @@ -1,24 +1,26 @@ diff --git a/templates/bootstrap/users_menu.tpl b/templates/bootstrap/users_menu.tpl index 06938601..478765b2 100644 --- a/templates/bootstrap/users_menu.tpl +++ b/templates/bootstrap/users_menu.tpl @@ -1,27 +1,30 @@ diff --git a/templates/bootstrap/vacation.tpl b/templates/bootstrap/vacation.tpl index edc2a12a..76b2dcd4 100644 --- a/templates/bootstrap/vacation.tpl +++ b/templates/bootstrap/vacation.tpl @@ -1,98 +1,108 @@
    -
    -

    {$PALANG.pUsersVacation_welcome}

    -
    - - {if !$authentication_has_role.user} -
    - -

    {$tUseremail}

    -
    - {/if} +
    +

    {$PALANG.pUsersVacation_welcome}

    +
    + + {if !$authentication_has_role.user}
    - -
    - -
    - - -
    -
    + +

    {$tUseremail}

    -
    - -
    - -
    - - -
    -
    + {/if} +
    + +
    + +
    + + +
    -
    - -
    - -
    +
    +
    + +
    + +
    + + +
    -
    - -
    - -
    +
    +
    + +
    +
    -
    - -
    - -
    +
    +
    + +
    +
    -
    - -
    + +
    {literal} - - - - - diff --git a/templates/bootstrap/index.tpl b/templates/bootstrap/index.tpl deleted file mode 100644 index 9a272d2b..00000000 --- a/templates/bootstrap/index.tpl +++ /dev/null @@ -1,30 +0,0 @@ - -{strip} - {include file="header.tpl"} - {if $smarty_template !== 'login' && $smarty_template !== 'password-recover' && $smarty_template !== 'password-change'} - {config_load file="menu.conf" section=$smarty_template} - {if $authentication_has_role.user} - {include file='users_menu.tpl'} - {else} - {include file='menu.tpl'} - {/if} - {/if} -
    - {if $authentication_has_role.user && $CONF.motd_user} -
    {$CONF.motd_user}
    - {elseif $authentication_has_role.global_admin && $CONF.motd_superadmin} -
    {$CONF.motd_superadmin}
    - {elseif $authentication_has_role.admin && $CONF.motd_admin} -
    {$CONF.motd_admin}
    - {/if} - - {include file='flash_error.tpl'} - {if $smarty_template} - {include file="$smarty_template.tpl"} - {else} -

    Template not found

    - ({$smarty.server.PHP_SELF|escape:"html"}) - {/if} -
    - {include file='footer.tpl'} -{/strip} diff --git a/templates/bootstrap/list-virtual.tpl b/templates/bootstrap/list-virtual.tpl deleted file mode 100644 index 61460654..00000000 --- a/templates/bootstrap/list-virtual.tpl +++ /dev/null @@ -1,126 +0,0 @@ -{assign var="file" value=$smarty.config.url_list_virtual} -
    -
    -
    -
    -
    - {html_options name='domain' class='form-control' output=$domain_list values=$domain_list selected=$domain_selected onchange="this.form.submit();"} - - -
    -
    -
    {#form_search#}
    -
    -
    -
    -
    - {if isset($search._)} -

    {$PALANG.pSearch_welcome} {$search._}

    - {else} -

    {$PALANG.pOverview_welcome}{$fDomain} :

    -
      -
    • {$PALANG.aliases}: {$limit.alias_count} / {$limit.aliases}
    • -
    • {$PALANG.mailboxes}: {$limit.mailbox_count} / {$limit.mailboxes}
    • -
    - {/if} -
    -
    -
    -
    {$PALANG.show} - {if isset($search._)} - {assign var="searchsuffix" value="&search[_]={$search._}"} - {else} - {assign var="searchsuffix" value=""} - {/if} - - {if $tab=='all'}{$PALANG.all} - {else}{$PALANG.all}{/if} - {if $tab=='mailbox'}{$PALANG.pOverview_mailbox_title} - {else}{$PALANG.pOverview_mailbox_title}{/if} - {if $tab=='alias'}{$PALANG.pOverview_alias_title} - {else}{$PALANG.pOverview_alias_title}{/if} - {if $boolconf_alias_domain} - {if $tab=='alias_domain'}{$PALANG.pOverview_alias_domain_title} - {else}{$PALANG.pOverview_alias_domain_title}{/if} - {/if} -
    -
    -
    -
    -

    -{*** Domain Aliases ***} -{if $boolconf_alias_domain} - {if $tab=='alias_domain' || $tab=='all'} - {include file="list-virtual_alias_domain.tpl"} - {/if} -{/if} -{if $tab=='all'} -
    -
    -{/if} -{*** Aliases ***} -{if $tab=='alias' || $tab=='all'} - {$nav_bar_alias.top} - {include file="list-virtual_alias.tpl"} - {$nav_bar_alias.bottom} -{/if} -{if $tab=='all'} -
    -
    -{/if} -{if $tab=='mailbox' || $tab=='all'} -
    - {$nav_bar_mailbox.top} - {assign var="colspan" value=9} - {if $CONF.vacation_control_admin===YES}{assign var="colspan" value="`$colspan+1`"}{/if} - {if $CONF.alias_control_admin===YES}{assign var="colspan" value="`$colspan+1`"}{/if} - - - - - - - {if $tMailbox} - {include file="list-virtual_mailbox.tpl"} - {else}
    {$PALANG.pOverview_mailbox_title}
    - {/if} - -
    -{/if} -{if $CONF.show_status===YES && $CONF.show_status_key===YES} -
    -
    - {if $CONF.show_undeliverable===YES} -   - {$CONF.show_status_text} - ={$PALANG.pStatus_undeliverable} - {/if} - {if $CONF.show_popimap===YES} -   - {$CONF.show_status_text} - ={$PALANG.pStatus_popimap} - {/if} - {if $CONF.show_custom_domains|@count>0} - {foreach from=$CONF.show_custom_domains item=item key=i} -   - {$CONF.show_status_text} - ={$PALANG.pStatus_custom}{$item} - {/foreach} - {/if} -{/if} diff --git a/templates/bootstrap/list-virtual_alias.tpl b/templates/bootstrap/list-virtual_alias.tpl deleted file mode 100644 index 4587b7c0..00000000 --- a/templates/bootstrap/list-virtual_alias.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{assign var="table" value='alias'} -{assign var="struct" value=$alias_data.struct} -{assign var="msg" value=$alias_data.msg} -{assign var="id_field" value=$msg.id_field} -{assign var="formconf" value=$alias_data.formconf} -{assign var="items" value=$tAlias} -{assign var="RAW_items" value=$RAW_tAlias} - -{include 'list.tpl'} - diff --git a/templates/bootstrap/list-virtual_alias_domain.tpl b/templates/bootstrap/list-virtual_alias_domain.tpl deleted file mode 100644 index 83c5dd1b..00000000 --- a/templates/bootstrap/list-virtual_alias_domain.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{*** Domain Aliases ***} - -{assign var="table" value='aliasdomain'} -{assign var="struct" value=$aliasdomain_data.struct} -{assign var="msg" value=$aliasdomain_data.msg} -{assign var="id_field" value=$msg.id_field} -{assign var="formconf" value=$aliasdomain_data.formconf} -{assign var="items" value=$tAliasDomains} -{assign var="RAW_items" value=$RAW_tAliasDomains} - -{include 'list.tpl'} diff --git a/templates/bootstrap/list-virtual_mailbox.tpl b/templates/bootstrap/list-virtual_mailbox.tpl deleted file mode 100644 index 353fa6e6..00000000 --- a/templates/bootstrap/list-virtual_mailbox.tpl +++ /dev/null @@ -1,114 +0,0 @@ -{if isset($search._)} - {assign var="search" value=$search._} -{else} - {assign var="search" value=''} -{/if} - - - {#tr_header#} - {if $CONF.show_status===YES}{/if} - {$PALANG.pOverview_mailbox_username} - {if $display_mailbox_aliases==true} - {$PALANG.to} - {/if} - {$PALANG.name} - {if $CONF.quota===YES}{$PALANG.pOverview_mailbox_quota}{/if} - {$PALANG.last_modified} - {$PALANG.active} - {assign var="colspan" value="`$colspan-6`"} -   - - - - {foreach from=$tMailbox item=item key=i} - - {if $CONF.show_status===YES} - {$gen_show_status_mailbox[$i]} - {/if} - - {if $search eq ""} - {$item.username} - {else} - {$item.username|replace:$search:"$search"} - {/if} - - {if $display_mailbox_aliases==true} - - {if $item.goto_mailbox == 1} - Mailbox
    - {else} - Forward only
    - {/if} - {foreach from=$item.goto_other item=item2 key=j} - {if $search eq ""} - {$item2} - {else} - {$item2|replace:$search:"$search"} - {/if} -
    - {/foreach} - - {/if} - {$item.name} - {if $CONF.quota===YES} - - {if $item.quota==0} - {$PALANG.pOverview_unlimited} - {elseif $item.quota<0} - {$PALANG.pOverview_disabled} - {else} - {if $boolconf_used_quotas} - - - {if $divide_quota.percent[$i] > $CONF.quota_level_high_pct} - {assign var="quota_level" value="high"} - {elseif $divide_quota.percent[$i] > $CONF.quota_level_med_pct} - {assign var="quota_level" value="mid"} - {else} - {assign var="quota_level" value="low"} - {/if} -
    -
    -
    {$divide_quota.current[$i]} / {$divide_quota.quota[$i]}
    - {else} - {$divide_quota.quota[$i]} - {/if} - {/if} - - {/if} - {$item.modified} - {if $item.active==1}{$PALANG.YES}{else}{$PALANG.NO}{/if} - {if $CONF.vacation_control_admin===YES && $CONF.vacation===YES} - {if $item.v_active!==-1} - {if $item.v_active==1} - {assign var="v_active" value=$PALANG.pOverview_vacation_edit} - {else} - {assign var="v_active" value=$PALANG.pOverview_vacation_option} - {/if} - {$v_active} - {/if} - {else} -   - {/if} - {assign var="edit_aliases" value=0} - {if $authentication_has_role.global_admin!==true && $CONF.alias_control_admin===YES}{assign var="edit_aliases" value=1}{/if} - {if $authentication_has_role.global_admin==true && $CONF.alias_control===YES}{assign var="edit_aliases" value=1}{/if} - {if $edit_aliases==1} - {$PALANG.alias} - {/if} - {$PALANG.edit} - -
    - - - - -
    - - - {/foreach} - - diff --git a/templates/bootstrap/list.tpl b/templates/bootstrap/list.tpl deleted file mode 100644 index 73e451f4..00000000 --- a/templates/bootstrap/list.tpl +++ /dev/null @@ -1,159 +0,0 @@ -
    - -{if ($admin_list|count > 1)} -
    -
    - {html_options name='username' output=$admin_list values=$admin_list selected=$admin_selected onchange="this.form.submit();"} - -
    -
    -{/if} - -{if $msg.show_simple_search} - {#form_search#} -{/if} - -{if $msg.show_simple_search} - {if ($search|count > 0)} -
    -

    {$PALANG.searchparams} - {foreach key=key item=field from=$search} - {if $struct.$key.label}{$struct.$key.label}{else}{$key}{/if} - {if isset($searchmode.$key)}{$searchmode.$key}{else}={/if} {$field} - - {/foreach} - [x] -

    - {/if} -{/if} - - - -{if $msg.list_header} - {assign var="colcount" value=2} - {foreach key=key item=field from=$struct} - {if $field.display_in_list == 1 && $field.label}{* don't show fields without a label *} - {assign var="colcount" value=$colcount+1} - {/if} - {/foreach} - - - - - -{/if} - - - - {foreach key=key item=field from=$struct} - {if $field.display_in_list == 1 && $field.label}{* don't show fields without a label *} - - {/if} - {/foreach} - - - - - -{foreach key=itemkey from=$RAW_items item=RAW_item} - {assign "item" $items.{htmlentities($itemkey, $smarty.const.ENT_QUOTES, 'UTF-8', false)}} {* array keys in $items are escaped using htmlentities(), see smarty.inc.php *} - - - {foreach key=key item=field from=$struct} - {if $field.display_in_list == 1 && $field.label} - - {if $field.linkto != '' && ($item.$id_field != '' || $item.$id_field > 0) } - {assign "linkto" "{$field.linkto|replace:'%s':{$item.$id_field|escape:url}}"} {* TODO: use label field instead *} - {assign "linktext" "{$item.{$key}}"} - {else} - {assign "linktext" $item.$key} - {/if} - - {if $table == 'foo' && $key == 'bar'} - - {else} - - {/if} - {/if} - {/foreach} - - - - -{/foreach} - -
    {$PALANG.{$msg.list_header}}
    {$field.label}  
    Special handling (complete table row) for {$table} / {$key} - {if $table == 'foo' && $key == 'bar'} - Special handling (td content) for {$table} / {$key} - {elseif $table == 'aliasdomain' && $key == 'target_domain' && $struct.target_domain.linkto == 'target'} - {$item.target_domain} -{* {elseif $table == 'domain' && $key == 'domain'} - {$item.domain} -*} - {elseif $key == 'active'} - {if $item._can_edit} - {$item._active} - {else} - {$item._active} - {/if} - {elseif $field.type == 'bool'} - {assign "tmpkey" "_{$key}"}{$item.{$tmpkey}} - {elseif $field.type == 'list'} - {foreach key=key2 item=field2 from=$item.$key}{$field2}
    {/foreach} - {elseif $field.type == 'pass'} - (hidden) - {elseif $field.type == 'quot'} - {assign "tmpkey" "_{$key}_percent"} - - {if $item[$tmpkey]>90} - {assign var="quota_level" value="high"} - {elseif $item[$tmpkey]>55} - {assign var="quota_level" value="mid"} - {else} - {assign var="quota_level" value="low"} - {/if} - {if $item[$tmpkey] > -1} -
    -
    -
    {$linktext}
    - {else} -
    -
    {$linktext}
    - {/if} - - {elseif $field.type == 'txtl'} - {foreach key=key2 item=field2 from=$item.$key}{$field2}
    {/foreach} - {elseif $field.type == 'html'} - {$RAW_item.$key} - {else} - {$linktext} - {/if} -
    {if $item._can_edit} - {$PALANG.edit} - {else}  - {/if} - {if $item._can_delete} -
    - - - - - -
    - {else} {/if} -
    - - - -
    diff --git a/templates/bootstrap/login.tpl b/templates/bootstrap/login.tpl deleted file mode 100644 index 090dadf9..00000000 --- a/templates/bootstrap/login.tpl +++ /dev/null @@ -1,61 +0,0 @@ - - -
    -

    {if $logintype=='admin'}{$PALANG.pLogin_welcome} - {else}{$PALANG.pUsersLogin_welcome} - {/if}

    -
    - - {if $logintype == 'admin'} -
    - - {/if} -
    - {literal} - - {/literal} -
    - diff --git a/templates/bootstrap/main.tpl b/templates/bootstrap/main.tpl deleted file mode 100644 index 4dd00a9d..00000000 --- a/templates/bootstrap/main.tpl +++ /dev/null @@ -1,36 +0,0 @@ - - diff --git a/templates/bootstrap/menu.tpl b/templates/bootstrap/menu.tpl deleted file mode 100644 index 2248359f..00000000 --- a/templates/bootstrap/menu.tpl +++ /dev/null @@ -1,129 +0,0 @@ - -{strip} - {if !empty($smarty.get) && !empty($smarty.get.domain)} - {*** zuweisung muss eleganter gehen ***} - {assign var="url_domain" value=$smarty.get.domain} - {assign var="url_domain" value="&domain={$url_domain|escape:url}"} - {/if} -{/strip} - -{strip} - -{/strip} diff --git a/templates/bootstrap/password-change.tpl b/templates/bootstrap/password-change.tpl deleted file mode 100644 index 10293236..00000000 --- a/templates/bootstrap/password-change.tpl +++ /dev/null @@ -1,29 +0,0 @@ -
    -
    - - - - - - - - - - - - - - - - - - - - - - - -

    {$PALANG.pPassword_welcome}

    {$PALANG.pLogin_username} :
    {$PALANG.pPassword_password_code} :
    {$PALANG.pPassword_password} :
    {$PALANG.pPassword_password2} :
    -
    -
    diff --git a/templates/bootstrap/password-recover.tpl b/templates/bootstrap/password-recover.tpl deleted file mode 100644 index 5ab378b2..00000000 --- a/templates/bootstrap/password-recover.tpl +++ /dev/null @@ -1,26 +0,0 @@ -
    -
    - - - - - - - - - - - - -
    {$PALANG.pPassword_recovery_title}
      - -
    -
    - {literal} - - {/literal} -
    diff --git a/templates/bootstrap/password.tpl b/templates/bootstrap/password.tpl deleted file mode 100644 index 620f3b97..00000000 --- a/templates/bootstrap/password.tpl +++ /dev/null @@ -1,40 +0,0 @@ -
    -
    -

    {$PALANG.pPassword_welcome}

    -
    - -
    - -

    {$SESSID_USERNAME}

    -
    -
    - -
    - {$pPassword_password_current_text} -
    -
    - -
    - {$pPassword_password_text} -
    -
    - -
    -
    -
    - -
    -
    diff --git a/templates/bootstrap/sendmail.tpl b/templates/bootstrap/sendmail.tpl deleted file mode 100644 index b97ff029..00000000 --- a/templates/bootstrap/sendmail.tpl +++ /dev/null @@ -1,33 +0,0 @@ -
    -
    -

    {$PALANG.pSendmail_welcome}

    -
    - -
    - -

    {$smtp_from_email}

    -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    diff --git a/templates/bootstrap/users_edit-alias.tpl b/templates/bootstrap/users_edit-alias.tpl deleted file mode 100644 index 1d267605..00000000 --- a/templates/bootstrap/users_edit-alias.tpl +++ /dev/null @@ -1,50 +0,0 @@ -
    -
    -

    {$PALANG.pEdit_alias_welcome}

    -
    - -

    {$PALANG.pEdit_alias_help}

    -
    - -

    {$USERID_USERNAME}

    -
    -
    - -
    - -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    diff --git a/templates/bootstrap/users_main.tpl b/templates/bootstrap/users_main.tpl deleted file mode 100644 index e07a6b16..00000000 --- a/templates/bootstrap/users_main.tpl +++ /dev/null @@ -1,26 +0,0 @@ - diff --git a/templates/bootstrap/users_menu.tpl b/templates/bootstrap/users_menu.tpl deleted file mode 100644 index 478765b2..00000000 --- a/templates/bootstrap/users_menu.tpl +++ /dev/null @@ -1,30 +0,0 @@ - diff --git a/templates/bootstrap/vacation.tpl b/templates/bootstrap/vacation.tpl deleted file mode 100644 index 76b2dcd4..00000000 --- a/templates/bootstrap/vacation.tpl +++ /dev/null @@ -1,110 +0,0 @@ -
    -
    -

    {$PALANG.pUsersVacation_welcome}

    -
    - - {if !$authentication_has_role.user} -
    - -

    {$tUseremail}

    -
    - {/if} -
    - -
    - -
    - - -
    -
    -
    -
    - -
    - -
    - - -
    -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    -
    -{literal} - -{/literal} diff --git a/templates/bootstrap/viewlog.tpl b/templates/bootstrap/viewlog.tpl deleted file mode 100644 index e2fcb63f..00000000 --- a/templates/bootstrap/viewlog.tpl +++ /dev/null @@ -1,35 +0,0 @@ -
    -
    -
    - {html_options name='fDomain' output=$domain_list values=$domain_list selected=$domain_selected onchange="this.form.submit();"} - -
    -
    - {if $tLog} -
    -

    {$PALANG.pViewlog_welcome|replace:"%s":$CONF.page_size} {$fDomain}

    -
    - - {#tr_header#} - - - - - - - {assign var="PALANG_pViewlog_data" value=$PALANG.pViewlog_data} - - {foreach from=$tLog item=item} - {assign var=log_data value=$item.data|truncate:35:"...":true} - {assign var=item_data value=$item.data} - {$smarty.config.tr_hilightoff|replace:'>':" style=\"cursor:pointer;\" onclick=\"alert('$PALANG_pViewlog_data = $item_data')\">"} - - - - - - - {/foreach} -
    {$PALANG.pViewlog_timestamp}{$PALANG.admin}{$PALANG.domain}{$PALANG.pViewlog_action}{$PALANG.pViewlog_data}
    {$item.timestamp}{$item.username}{$item.domain}{$item.action}{$log_data}
    - {/if} -
    diff --git a/templates/broadcast-message.tpl b/templates/broadcast-message.tpl index b1a5f442..7f56f5ef 100644 --- a/templates/broadcast-message.tpl +++ b/templates/broadcast-message.tpl @@ -1,44 +1,43 @@ -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {$PALANG.pBroadcast_title}
    {$smtp_from_email}
    - -
      - -
    -
    +
    +
    +

    {$PALANG.pBroadcast_title}

    +
    + +
    + +

    {$smtp_from_email}

    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/templates/editform.tpl b/templates/editform.tpl index b9cc84c2..a5e0fd1a 100644 --- a/templates/editform.tpl +++ b/templates/editform.tpl @@ -1,80 +1,80 @@ -
    -
    - - + +
    +

    {$formtitle}

    +
    + + - - - - + {foreach key=key item=field from=$struct} + {if $field.display_in_form == 1} -{foreach key=key item=field from=$struct} - {if $field.display_in_form == 1} + {if $table == 'foo' && $key == 'bar'} +
    Special handling (complete table row) for {$table} / {$key}
    + {else} +
    + +
    + {if $field.editable == 0} + {if $field.type == 'enma'} + {$struct.{$key}.options.{$value_{$key}}} + {else} + {$value_{$key}} + {/if} + {else} + {if $table == 'foo' && $key == 'bar'} + Special handling (td content) for {$table} / {$key} + {elseif $field.type == 'bool'} +
    + {elseif $field.type == 'enum'} + + {elseif $field.type == 'enma'} + + {elseif $field.type == 'list'} + + {elseif $field.type == 'pass' || $field.type == 'b64p'} + + {elseif $field.type == 'txtl'} + + {else} + + {/if} + {/if} - {if $table == 'foo' && $key == 'bar'} -
    - {else} - - - - - - - {/if} + {/if} + {/foreach} - {/if} -{/foreach} - - - - - -
    {$formtitle}
    Special handling (complete table row) for {$table} / {$key}
    {$field.label} - {if $field.editable == 0} - {if $field.type == 'enma'} - {$struct.{$key}.options.{$value_{$key}}} - {else} - {$value_{$key}} - {/if} - {else} - {if $table == 'foo' && $key == 'bar'} - Special handling (td content) for {$table} / {$key} - {elseif $field.type == 'bool'} - - {elseif $field.type == 'enum'} - - {elseif $field.type == 'enma'} - - {elseif $field.type == 'list'} - + {if $table == 'foo' && $key == 'bar'} + Special handling (td content) for {$table} / {$key} + {else} + {if $fielderror.{$key}} + {$fielderror.{$key}} + {else} + {$field.desc} + {/if} + {/if} + + + {/if} - - {elseif $field.type == 'pass' || $field.type == 'b64p'} - - {elseif $field.type == 'txtl'} - - {else} - - {/if} - {/if} - - {if $table == 'foo' && $key == 'bar'} - Special handling (td content) for {$table} / {$key} - {else} - {$field.desc} - {/if} - {$fielderror.{$key}}
     
    +
    + +
    -
    diff --git a/templates/flash_error.tpl b/templates/flash_error.tpl index 264139cf..627a35f0 100644 --- a/templates/flash_error.tpl +++ b/templates/flash_error.tpl @@ -1,20 +1,24 @@ -

    +

    {strip} - {if isset($smarty.session.flash)} - {if isset($smarty.session.flash.info)} -
      - {foreach from=$smarty.session.flash.info item=msg} -
    • {$msg|escape:html}
    • - {/foreach} -
    - {/if} - {if isset($smarty.session.flash.error)} -
      - {foreach from=$smarty.session.flash.error item=msg} -
    • {$msg|escape:html}
    • - {/foreach} -
    - {/if} - {/if} + {if isset($smarty.session.flash)} + {if isset($smarty.session.flash.info)} + + {/if} + {if isset($smarty.session.flash.error)} + + {/if} + {/if} {/strip} diff --git a/templates/footer.tpl b/templates/footer.tpl index d5fd4a4b..97562584 100644 --- a/templates/footer.tpl +++ b/templates/footer.tpl @@ -1,19 +1,22 @@ - + {if $CONF.show_footer_text == 'YES' && $CONF.footer_link} +    |    + {$CONF.footer_text} + {/if} +
    + diff --git a/templates/header.tpl b/templates/header.tpl index 6804c2cf..d68edb78 100644 --- a/templates/header.tpl +++ b/templates/header.tpl @@ -1,21 +1,21 @@ - - - - Postfix Admin - {$smarty.server.HTTP_HOST} - - -{if $CONF.theme_custom_css} - -{/if} - - -
    -
    - -{if $CONF.show_header_text==='YES' && $CONF.header_text} -

    {$CONF.header_text}

    -{/if} -
    + + + + + + + Postfix Admin - {$smarty.server.HTTP_HOST} + + + {if $CONF.theme_custom_css} + + {/if} + + + + + + diff --git a/templates/index.tpl b/templates/index.tpl index 8926dd01..9a272d2b 100644 --- a/templates/index.tpl +++ b/templates/index.tpl @@ -1,29 +1,30 @@ {strip} -{include file="header.tpl"} -{if $smarty_template !== 'login' && $smarty_template !== 'password-recover' && $smarty_template !== 'password-change'} - {config_load file="menu.conf" section=$smarty_template} - {if $authentication_has_role.user} - {include file='users_menu.tpl'} - {else} - {include file='menu.tpl'} - {/if} -{/if} -
    + {include file="header.tpl"} + {if $smarty_template !== 'login' && $smarty_template !== 'password-recover' && $smarty_template !== 'password-change'} + {config_load file="menu.conf" section=$smarty_template} + {if $authentication_has_role.user} + {include file='users_menu.tpl'} + {else} + {include file='menu.tpl'} + {/if} + {/if} +
    + {if $authentication_has_role.user && $CONF.motd_user} +
    {$CONF.motd_user}
    + {elseif $authentication_has_role.global_admin && $CONF.motd_superadmin} +
    {$CONF.motd_superadmin}
    + {elseif $authentication_has_role.admin && $CONF.motd_admin} +
    {$CONF.motd_admin}
    + {/if} -{if $authentication_has_role.user && $CONF.motd_user} -
    {$CONF.motd_user}
    -{elseif $authentication_has_role.global_admin && $CONF.motd_superadmin} -
    {$CONF.motd_superadmin}
    -{elseif $authentication_has_role.admin && $CONF.motd_admin} -
    {$CONF.motd_admin}
    -{/if} - -{include file='flash_error.tpl'} -{if $smarty_template} - {include file="$smarty_template.tpl"} -{else} -

    Template not found

    ({$smarty.server.PHP_SELF|escape:"html"}) -{/if} -{include file='footer.tpl'} + {include file='flash_error.tpl'} + {if $smarty_template} + {include file="$smarty_template.tpl"} + {else} +

    Template not found

    + ({$smarty.server.PHP_SELF|escape:"html"}) + {/if} +
    + {include file='footer.tpl'} {/strip} diff --git a/templates/list-virtual.tpl b/templates/list-virtual.tpl index e31da865..61460654 100644 --- a/templates/list-virtual.tpl +++ b/templates/list-virtual.tpl @@ -1,92 +1,126 @@ {assign var="file" value=$smarty.config.url_list_virtual} -
    -
    - {html_options name='domain' output=$domain_list values=$domain_list selected=$domain_selected onchange="this.form.submit();"} - - -
    -{if isset($search._)} -

    {$PALANG.pSearch_welcome} {$search._}

    -{else} -

    {$PALANG.pOverview_welcome}{$fDomain}

    -

    {$PALANG.aliases}: {$limit.alias_count} / {$limit.aliases}

    -

    {$PALANG.mailboxes}: {$limit.mailbox_count} / {$limit.mailboxes}

    -{/if} -{#form_search#} -
    - +

    {*** Domain Aliases ***} {if $boolconf_alias_domain} - {if $tab=='alias_domain' || $tab=='all'} - {include file="list-virtual_alias_domain.tpl"} - {/if} + {if $tab=='alias_domain' || $tab=='all'} + {include file="list-virtual_alias_domain.tpl"} + {/if} +{/if} +{if $tab=='all'} +
    +
    {/if} -{if $tab=='all'}
    {/if} {*** Aliases ***} {if $tab=='alias' || $tab=='all'} - {$nav_bar_alias.top} - {include file="list-virtual_alias.tpl"} - {$nav_bar_alias.bottom} + {$nav_bar_alias.top} + {include file="list-virtual_alias.tpl"} + {$nav_bar_alias.bottom} +{/if} +{if $tab=='all'} +
    +
    {/if} -{if $tab=='all'}
    {/if} {if $tab=='mailbox' || $tab=='all'} - {$nav_bar_mailbox.top} - {assign var="colspan" value=9} - {if $CONF.vacation_control_admin===YES}{assign var="colspan" value="`$colspan+1`"}{/if} - {if $CONF.alias_control_admin===YES}{assign var="colspan" value="`$colspan+1`"}{/if} - - - - - {if $tMailbox} - {include file="list-virtual_mailbox.tpl"} - {else}
    {$PALANG.pOverview_mailbox_title}
    - {/if} - {$nav_bar_mailbox.bottom} - {if $tCanAddMailbox} -
    {$PALANG.add_mailbox}
    - {/if} -

    {$PALANG.download_csv} +
    + {$nav_bar_mailbox.top} + {assign var="colspan" value=9} + {if $CONF.vacation_control_admin===YES}{assign var="colspan" value="`$colspan+1`"}{/if} + {if $CONF.alias_control_admin===YES}{assign var="colspan" value="`$colspan+1`"}{/if} + + + + + + + {if $tMailbox} + {include file="list-virtual_mailbox.tpl"} + {else}
    {$PALANG.pOverview_mailbox_title}
    + {/if} + +
    {/if} {if $CONF.show_status===YES && $CONF.show_status_key===YES} -

    - {if $CONF.show_undeliverable===YES} -  {$CONF.show_status_text}={$PALANG.pStatus_undeliverable} - {/if} - {if $CONF.show_vacation===YES} -  {$CONF.show_status_text}={$PALANG.pStatus_vacation} - {/if} - {if $CONF.show_disabled===YES} -  {$CONF.show_status_text}={$PALANG.pStatus_disabled} - {/if} - {if $CONF.show_expired===YES} -  {$CONF.show_status_text}={$PALANG.pStatus_expired} - {/if} - - {if $CONF.show_popimap===YES} -  {$CONF.show_status_text}={$PALANG.pStatus_popimap} - {/if} - {if $CONF.show_custom_domains|@count>0} - {foreach from=$CONF.show_custom_domains item=item key=i} -  {$CONF.show_status_text}={$PALANG.pStatus_custom}{$item} - {/foreach} - {/if} +
    +
    + {if $CONF.show_undeliverable===YES} +   + {$CONF.show_status_text} + ={$PALANG.pStatus_undeliverable} + {/if} + {if $CONF.show_popimap===YES} +   + {$CONF.show_status_text} + ={$PALANG.pStatus_popimap} + {/if} + {if $CONF.show_custom_domains|@count>0} + {foreach from=$CONF.show_custom_domains item=item key=i} +   + {$CONF.show_status_text} + ={$PALANG.pStatus_custom}{$item} + {/foreach} + {/if} {/if} diff --git a/templates/list-virtual_mailbox.tpl b/templates/list-virtual_mailbox.tpl index 409591ab..353fa6e6 100644 --- a/templates/list-virtual_mailbox.tpl +++ b/templates/list-virtual_mailbox.tpl @@ -4,24 +4,24 @@ {assign var="search" value=''} {/if} + {#tr_header#} - {if $CONF.show_status===YES}{/if} - {$PALANG.pOverview_mailbox_username} + {if $CONF.show_status===YES}{/if} + {$PALANG.pOverview_mailbox_username} {if $display_mailbox_aliases==true} - {$PALANG.to} + {$PALANG.to} {/if} - {$PALANG.name} - {if $CONF.quota===YES}{$PALANG.pOverview_mailbox_quota}{/if} - {$PALANG.last_modified} - {if $CONF.password_expiration===YES} - {$PALANG.password_expiration} - {/if} - {$PALANG.active} + {$PALANG.name} + {if $CONF.quota===YES}{$PALANG.pOverview_mailbox_quota}{/if} + {$PALANG.last_modified} + {$PALANG.active} {assign var="colspan" value="`$colspan-6`"} -   +   + + {foreach from=$tMailbox item=item key=i} - {#tr_hilightoff#} + {if $CONF.show_status===YES} {$gen_show_status_mailbox[$i]} {/if} @@ -77,9 +77,6 @@ {/if} {$item.modified} - {if $CONF.password_expiration===YES} - {$item.password_expiration} - {/if} {if $item.active==1}{$PALANG.YES}{else}{$PALANG.NO}{/if} {if $CONF.vacation_control_admin===YES && $CONF.vacation===YES} @@ -101,8 +98,17 @@ {$PALANG.alias} {/if} {$PALANG.edit} - {$PALANG.del} + +
    + + + + +
    + {/foreach} + diff --git a/templates/list.tpl b/templates/list.tpl index 992efc28..73e451f4 100644 --- a/templates/list.tpl +++ b/templates/list.tpl @@ -1,14 +1,17 @@ -
    +
    + +{if ($admin_list|count > 1)} +
    - {if ($admin_list|count > 1)} {html_options name='username' output=$admin_list values=$admin_list selected=$admin_selected onchange="this.form.submit();"} - {/if}
    +
    +{/if} + {if $msg.show_simple_search} {#form_search#} {/if} -
    {if $msg.show_simple_search} {if ($search|count > 0)} @@ -24,36 +27,37 @@ {/if} {/if} - - -
    - +
    {if $msg.list_header} {assign var="colcount" value=2} - {foreach key=key item=field from=$struct} - {if $field.display_in_list == 1 && $field.label}{* don't show fields without a label *} + {foreach key=key item=field from=$struct} + {if $field.display_in_list == 1 && $field.label}{* don't show fields without a label *} {assign var="colcount" value=$colcount+1} - {/if} - {/foreach} + {/if} + {/foreach} + - + + {/if} + {foreach key=key item=field from=$struct} {if $field.display_in_list == 1 && $field.label}{* don't show fields without a label *} - + {/if} {/foreach} - - + + + {foreach key=itemkey from=$RAW_items item=RAW_item} {assign "item" $items.{htmlentities($itemkey, $smarty.const.ENT_QUOTES, 'UTF-8', false)}} {* array keys in $items are escaped using htmlentities(), see smarty.inc.php *} - {#tr_hilightoff#} + {foreach key=key item=field from=$struct} {if $field.display_in_list == 1 && $field.label} @@ -78,7 +82,7 @@ *} {elseif $key == 'active'} {if $item._can_edit} - {$item._active} + {$item._active} {else} {$item._active} {/if} @@ -91,11 +95,11 @@ {elseif $field.type == 'quot'} {assign "tmpkey" "_{$key}_percent"} - {if $item[$tmpkey] > $CONF.quota_level_high_pct} + {if $item[$tmpkey]>90} {assign var="quota_level" value="high"} - {elseif $item[$tmpkey] > $CONF.quota_level_med_pct} + {elseif $item[$tmpkey]>55} {assign var="quota_level" value="mid"} - {else} + {else} {assign var="quota_level" value="low"} {/if} {if $item[$tmpkey] > -1} @@ -119,18 +123,37 @@ {/if} {/foreach} - - + + {/foreach}
    {$PALANG.{$msg.list_header}}{$PALANG.{$msg.list_header}}
    {$field.label}{$field.label}    
    {if $item._can_edit}{$PALANG.edit}{else} {/if}{if $item._can_delete}{$PALANG.del}{else} {/if}{if $item._can_edit} + {$PALANG.edit} + {else}  + {/if} + {if $item._can_delete} +
    + + + + + +
    + {else} {/if} +
    -{if $msg.can_create} -
    {$PALANG.{$formconf.create_button}}
    -
    -{/if} -
    {$PALANG.download_csv} +
    diff --git a/templates/login.tpl b/templates/login.tpl index 01bddfd0..090dadf9 100644 --- a/templates/login.tpl +++ b/templates/login.tpl @@ -1,47 +1,61 @@ -
    -
    - - - - - - - - - - - - - - - - - - - - - -{if $logintype == 'admin'} - - - -{/if} -
    -{if $logintype=='admin'}{$PALANG.pLogin_welcome} -{else}{$PALANG.pUsersLogin_welcome} -{/if} -
    -{if $forgotten_password_reset} -
    {$PALANG.pUsersLogin_password_recover} -{/if} -
    {$language_selector}
     
    {$PALANG.pLogin_login_users}
    -
    -{literal} - -{/literal} + + +
    +

    {if $logintype=='admin'}{$PALANG.pLogin_welcome} + {else}{$PALANG.pUsersLogin_welcome} + {/if}

    +
    + + {if $logintype == 'admin'} +
    + + {/if} +
    + {literal} + + {/literal}
    diff --git a/templates/main.tpl b/templates/main.tpl index 6f5dbfb5..4dd00a9d 100644 --- a/templates/main.tpl +++ b/templates/main.tpl @@ -1,35 +1,36 @@ - +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    -
    diff --git a/templates/users_main.tpl b/templates/users_main.tpl index 339dbdbd..e07a6b16 100644 --- a/templates/users_main.tpl +++ b/templates/users_main.tpl @@ -1,24 +1,26 @@ - From d83b287297d00c147d22104757ee4b78539a5bdd Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 28 Sep 2020 20:33:21 +0100 Subject: [PATCH 083/691] rejig smarty --- lib/smarty.inc.php | 10 ------ model/PFASmarty.php | 83 ++++++++++++++++++++++----------------------- 2 files changed, 41 insertions(+), 52 deletions(-) delete mode 100644 lib/smarty.inc.php diff --git a/lib/smarty.inc.php b/lib/smarty.inc.php deleted file mode 100644 index 4233cf96..00000000 --- a/lib/smarty.inc.php +++ /dev/null @@ -1,10 +0,0 @@ -getAll(); + $theme = ''; if (isset($CONF['theme']) && is_dir(dirname(__FILE__) . "/../templates/" . $CONF['theme'])) { - $smarty = new PFASmarty($CONF['theme']); - } else { - $smarty = new PFASmarty(); + $theme = $CONF['theme']; } - $smarty->configureTheme('');// default to something. + $this->template = new Smarty(); - $smarty->assign('CONF', $CONF); - $smarty->assign('PALANG', $CONF['__PALANG'] ?? []); - $smarty->assign('url_domain', ''); - $smarty->assign('version', $CONF['version'] ?? 'unknown'); + $template_dir = __DIR__ . '/../templates/' . $theme; - $smarty->assign('boolconf_alias_domain', Config::bool('alias_domain')); - $smarty->assign('authentication_has_role', array('global_admin' => authentication_has_role('global-admin'), 'admin' => authentication_has_role('admin'), 'user' => authentication_has_role('user'))); + if (!is_dir($template_dir)) { + $template_dir = __DIR__ . '/../templates/'; + } - return $smarty; + $this->template->setTemplateDir($template_dir); + + // if it's not present or writeable, smarty should just not cache. + $templates_c = dirname(__FILE__) . '/../templates_c'; + if (is_dir($templates_c) && is_writeable($templates_c)) { + $this->template->setCompileDir($templates_c); + } else { + # unfortunately there's no sane way to just disable compiling of templates + clearstatcache(); // just incase someone just fixed it; on their next refresh it should work. + error_log("ERROR: directory $templates_c doesn't exist or isn't writeable for the webserver"); + die("ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver"); + } + + $this->configureTheme('');// default to something. } /** @@ -54,37 +70,8 @@ class PFASmarty { $this->assign('CONF', $CONF); } - /** - * @var Smarty - */ - protected $template; - /** - * @param string $template_theme - */ - public function __construct($template_theme = 'default') { - $this->template = new Smarty(); - //$this->template->debugging = true; - if ($template_theme == 'default') { - $this->template->setTemplateDir(dirname(__FILE__) . '/../templates'); - } else { - $this->template->setTemplateDir(dirname(__FILE__) . '/../templates/' . $template_theme); - } - - // if it's not present or writeable, smarty should just not cache. - $templates_c = dirname(__FILE__) . '/../templates_c'; - if (is_dir($templates_c) && is_writeable($templates_c)) { - $this->template->setCompileDir($templates_c); - } else { - # unfortunately there's no sane way to just disable compiling of templates - clearstatcache(); // just incase someone just fixed it; on their next refresh it should work. - error_log("ERROR: directory $templates_c doesn't exist or isn't writeable for the webserver"); - die("ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver"); - } - - $this->template->setConfigDir(dirname(__FILE__) . '/../configs'); - } /** * @param string $key @@ -106,6 +93,16 @@ class PFASmarty { * @return void */ public function display($template) { + $CONF = Config::getInstance()->getAll(); + + + $this->assign('CONF', $CONF); + $this->assign('PALANG', $CONF['__LANG'] ?? []); + $this->assign('url_domain', ''); + $this->assign('version', $CONF['version'] ?? 'unknown'); + $this->assign('boolconf_alias_domain', Config::bool('alias_domain')); + $this->assign('authentication_has_role', array('global_admin' => authentication_has_role('global-admin'), 'admin' => authentication_has_role('admin'), 'user' => authentication_has_role('user'))); + header("Expires: Sun, 16 Mar 2003 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); @@ -113,7 +110,9 @@ class PFASmarty { header("Pragma: no-cache"); header("Content-Type: text/html; charset=UTF-8"); + $this->template->setConfigDir(__DIR__ . '/../configs'); $this->template->display($template); + unset($_SESSION['flash']); # cleanup flash messages } From b8fa60bb8a9592151509990e1c7124b19d839f79 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 28 Sep 2020 20:33:54 +0100 Subject: [PATCH 084/691] more type hints / psalm fixes --- common.php | 14 +++++----- config.inc.php | 2 +- model/Config.php | 55 +++++++++++----------------------------- model/Login.php | 1 - model/MailboxHandler.php | 2 +- model/PFAHandler.php | 2 +- public/list.php | 1 + public/main.php | 2 +- 8 files changed, 27 insertions(+), 52 deletions(-) diff --git a/common.php b/common.php index 5e93e225..a89a8484 100644 --- a/common.php +++ b/common.php @@ -45,6 +45,7 @@ function postfixadmin_autoload($class) { } return false; } + spl_autoload_register('postfixadmin_autoload'); if (!is_file("$incpath/config.inc.php")) { @@ -53,7 +54,6 @@ if (!is_file("$incpath/config.inc.php")) { global $CONF; - require_once("$incpath/config.inc.php"); @@ -63,9 +63,10 @@ if (isset($CONF['configured']) && !defined('PHPUNIT_TEST')) { } } -Config::write($CONF); +Config::getInstance()->setAll($CONF); $PALANG = []; + require_once("$incpath/languages/language.php"); require_once("$incpath/functions.inc.php"); @@ -86,13 +87,12 @@ if (!empty($CONF['language_hook']) && function_exists($CONF['language_hook'])) { Config::write('__LANG', $PALANG); -unset($incpath); - if (!defined('POSTFIXADMIN_CLI')) { - if (!is_file(dirname(__FILE__) . "/lib/smarty.inc.php")) { - die("smarty.inc.php is missing! Something is wrong..."); + if (!isset($CONF) || !isset($PALANG)) { + die("environment not setup correctly"); } - require_once(dirname(__FILE__) . "/lib/smarty.inc.php"); + require_once(__DIR__ . '/lib/smarty/libs/Autoloader.php'); + Smarty_Autoloader::register(); } /* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */ diff --git a/config.inc.php b/config.inc.php index f14c9760..9abdeef3 100644 --- a/config.inc.php +++ b/config.inc.php @@ -672,7 +672,7 @@ function x_send_sms_clickatell($to, $message) { */ // Theme Config -$CONF['theme'] = 'bootstrap'; +$CONF['theme'] = 'default'; // Specify your own favicon, logo and CSS file $CONF['theme_favicon'] = 'images/favicon.ico'; $CONF['theme_logo'] = 'images/logo-default.png'; diff --git a/model/Config.php b/model/Config.php index 53f2586e..425d79ae 100644 --- a/model/Config.php +++ b/model/Config.php @@ -9,7 +9,7 @@ final class Config { /** * @var array */ - private $config; + private $config = []; # do not error_log() 'undefined config option' for deprecated options private static $deprecated_options = array( @@ -20,7 +20,6 @@ final class Config { * Return a singleton instance of Config * @return Config */ - public static function getInstance() { if (self::$instance == null) { self::$instance = new self(); @@ -31,29 +30,14 @@ final class Config { /** * Used to write a dynamic var in the Configure instance. * - * Usage - * Configure::write('One.key1', 'value of the Configure::One[key1]'); - * Configure::write(array('One.key1' => 'value of the Configure::One[key1]')); - * Configure::write('One', array('key1'=>'value of the Configure::One[key1]', 'key2'=>'value of the Configure::One[key2]'); - * Configure::write(array('One.key1' => 'value of the Configure::One[key1]', 'One.key2' => 'value of the Configure::One[key2]')); - * - * @param mixed $config string or array of var to write + * @param string $key * @param mixed $value to set for key. * @return void */ - public static function write($config, $value = null) { + public static function write(string $key, $value = null) { $_this = self::getInstance(); - - if (!is_array($config)) { - $config = array($config => $value); - } - $newConfig = $_this->getAll(); - - foreach ($config as $name => $value) { - $newConfig[$name] = $value; - } - + $newConfig[$key] = $value; $_this->setAll($newConfig); } @@ -61,7 +45,7 @@ final class Config { * @param string $var * @return array */ - public static function read_array($var) { + public static function read_array(string $var) : array { $stuff = self::read($var); if (!is_array($stuff)) { @@ -75,7 +59,7 @@ final class Config { * @param string $var * @return string */ - public static function read_string($var) { + public static function read_string(string $var) : string { $stuff = self::read($var); if ($stuff === null) { @@ -91,17 +75,10 @@ final class Config { } /** - * Used to read Configure::$var - * - * Usage - * Configure::read('Name'); will return all values for Name - * Configure::read('Name.key'); will return only the value of Configure::Name[key] - * * @param string $var Variable to obtain - * @return array|string|null|bool some value - * @access public + * @return callable|array|string|null|bool some value */ - public static function read($var) { + public static function read(string $var) { $_this = self::getInstance(); $config = $_this->getAll(); @@ -129,7 +106,7 @@ final class Config { * @param string $value Value to use as sprintf parameter * @return string value of Config::$var, parsed by sprintf */ - public static function read_f($var, $value) { + public static function read_f(string $var, string $value) : string { $text = self::read_string($var); $newtext = sprintf($text, $value); @@ -152,8 +129,7 @@ final class Config { * @param string $var Variable to obtain * @return bool value of Configure::$var (TRUE (on YES/yes) or FALSE (on NO/no/not set/unknown value) */ - - public static function bool($var) { + public static function bool(string $var) : bool { $value = self::read($var); if (is_bool($value)) { @@ -184,7 +160,7 @@ final class Config { * Used to read Config::$var, converted to bool, returned as integer (0 or 1) * @see bool() */ - public static function intbool($var) { + public static function intbool($var) : int { return Config::bool($var) ? 1 : 0; } @@ -197,7 +173,7 @@ final class Config { * @return string value of $PALANG[$var] * @access public */ - public static function lang($var) { + public static function lang(string $var) : string { $languages = self::read_array('__LANG'); $value = $languages[$var] ?? ''; @@ -217,7 +193,7 @@ final class Config { * @param string $value Value to use as sprintf parameter * @return string value of $PALANG[$var], parsed by sprintf */ - public static function lang_f($var, $value) { + public static function lang_f(string $var, $value) : string { $all = self::read_array('__LANG'); $text = $all[$var] ?? ''; @@ -235,9 +211,8 @@ final class Config { /** * @return array */ - public function getAll() { - $output = $this->config; - return $output; + public function getAll() : array { + return $this->config; } /** diff --git a/model/Login.php b/model/Login.php index f8d1523f..96bbe21d 100644 --- a/model/Login.php +++ b/model/Login.php @@ -1,6 +1,5 @@ id); - $maildir_name_hook = Config::read_string('maildir_name_hook'); + $maildir_name_hook = Config::read('maildir_name_hook'); if (is_string($maildir_name_hook) && $maildir_name_hook != 'NO' && function_exists($maildir_name_hook)) { $maildir = $maildir_name_hook($domain, $this->id); diff --git a/model/PFAHandler.php b/model/PFAHandler.php index 74cbae4e..eb4f9c28 100644 --- a/model/PFAHandler.php +++ b/model/PFAHandler.php @@ -237,7 +237,7 @@ abstract class PFAHandler { ); } - $struct_hook = Config::read_string($this->db_table . '_struct_hook'); + $struct_hook = Config::read($this->db_table . '_struct_hook'); if (!empty($struct_hook) && is_string($struct_hook) && $struct_hook != 'NO' && function_exists($struct_hook)) { $this->struct = $struct_hook($this->struct); } diff --git a/public/list.php b/public/list.php index f2b4f0e1..08fd9523 100644 --- a/public/list.php +++ b/public/list.php @@ -85,6 +85,7 @@ if (count($search)) { $items = $handler->result(); + if (count($handler->errormsg)) { flash_error($handler->errormsg); } diff --git a/public/main.php b/public/main.php index a2460da2..606e4e37 100644 --- a/public/main.php +++ b/public/main.php @@ -20,7 +20,7 @@ * Form POST \ GET Variables: -none- */ -require_once('common.php'); +require_once(__DIR__ . '/common.php'); $SESSID_USERNAME = authentication_get_username(); From 712939eb88458eebc86b11bdf67d1c1b46cf08ca Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 28 Sep 2020 21:51:57 +0100 Subject: [PATCH 085/691] maintain backwards compatability with PFAHAndler::{store(),storemore(),beforestore()} --- model/PFAHandler.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/model/PFAHandler.php b/model/PFAHandler.php index eb4f9c28..a38774bb 100644 --- a/model/PFAHandler.php +++ b/model/PFAHandler.php @@ -525,6 +525,10 @@ abstract class PFAHandler { # do nothing } + public function store() : bool { + return $this->save(); + } + /** * save $this->values to the database * @@ -598,8 +602,16 @@ abstract class PFAHandler { return $result; } + public function beforeStore() : bool { + return $this->beforeStore(); + } + + public function storeMore() : bool { + return $this->storeMore(); + } + /** - * called by $this->store() before storing the values in the database + * called by $this->save() before storing the values in the database * @return bool - if false, save() will abort */ protected function preSave() : bool { From aab725eaeed73e1b380362f91b49432a5c5c251a Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Thu, 1 Oct 2020 21:01:31 +0100 Subject: [PATCH 086/691] put a min-width on the main container to cover up it not rendering very well when too many features are turned on etc etc etc --- templates/index.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/index.tpl b/templates/index.tpl index 9a272d2b..d4fba0db 100644 --- a/templates/index.tpl +++ b/templates/index.tpl @@ -9,7 +9,7 @@ {include file='menu.tpl'} {/if} {/if} -
    +
    {if $authentication_has_role.user && $CONF.motd_user}
    {$CONF.motd_user}
    {elseif $authentication_has_role.global_admin && $CONF.motd_superadmin} From d07d115bd531301eeb11b8880632743f1d06a4ca Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Fri, 2 Oct 2020 20:56:45 +0100 Subject: [PATCH 087/691] fix names .... --- model/PFAHandler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model/PFAHandler.php b/model/PFAHandler.php index a38774bb..c9a9194a 100644 --- a/model/PFAHandler.php +++ b/model/PFAHandler.php @@ -603,11 +603,11 @@ abstract class PFAHandler { } public function beforeStore() : bool { - return $this->beforeStore(); + return $this->preSave(); } public function storeMore() : bool { - return $this->storeMore(); + return $this->postSave(); } /** From 16531534a3aafcf498f3f7b22da40cd31e386455 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Fri, 2 Oct 2020 20:57:55 +0100 Subject: [PATCH 088/691] add @deprecated phpdoc --- model/PFAHandler.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/model/PFAHandler.php b/model/PFAHandler.php index c9a9194a..9df03d1e 100644 --- a/model/PFAHandler.php +++ b/model/PFAHandler.php @@ -602,10 +602,16 @@ abstract class PFAHandler { return $result; } + /** + * @deprecated use preSave() instead. + */ public function beforeStore() : bool { return $this->preSave(); } + /** + * @deprecated use postSave() instead. + */ public function storeMore() : bool { return $this->postSave(); } From e35bbb3d909f5000b92849eb7d77aa6c073c04a4 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Sat, 3 Oct 2020 20:12:43 +0100 Subject: [PATCH 089/691] add width: min-content; min-width: 600px to the main template to try and make it render better for wide list tables --- templates/index.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/index.tpl b/templates/index.tpl index d4fba0db..0784d054 100644 --- a/templates/index.tpl +++ b/templates/index.tpl @@ -9,7 +9,7 @@ {include file='menu.tpl'} {/if} {/if} -
    +
    {if $authentication_has_role.user && $CONF.motd_user}
    {$CONF.motd_user}
    {elseif $authentication_has_role.global_admin && $CONF.motd_superadmin} From b7afe73502c5aef3d664a93a5a92626253fe2c20 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 9 Nov 2020 21:15:06 +0000 Subject: [PATCH 090/691] fix detection of postgresql pdo extension --- public/setup.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/setup.php b/public/setup.php index cd488dc1..586797d9 100644 --- a/public/setup.php +++ b/public/setup.php @@ -107,7 +107,7 @@ require(dirname(__FILE__) . '/../templates/header.php'); } // Check if there is support for at least 1 database - if (($m_pdo == 0) and ($m_pdo_mysql == 0) and ($m_pdo_sqlite == 0) and ($m_pdo_psql == 0) ) { + if (($m_pdo == 0) and ($m_pdo_mysql == 0) and ($m_pdo_sqlite == 0) and ($m_pdo_pgsql == 0) ) { print "
  • Error: There is no database (PDO) support in your PHP setup
    \n"; print " You MUST install a suitable PHP PDO extension (e.g. pdo_pgsql, pdo_mysql or pdo_sqlite). From 06897d22346c6309503f8613d10bd5e07a0fe583 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 9 Nov 2020 21:30:32 +0000 Subject: [PATCH 091/691] bump psalm to v4.x --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 938f17e8..1ad681ac 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,7 @@ "php": ">7.2.0", "cedx/coveralls": "^11.0", "phpunit/phpunit": "8.*", - "vimeo/psalm":"^3.0", + "vimeo/psalm":"^4.0", "shardj/zf1-future" : "^1.12" }, "autoload": { From 4712d83c9839ec51f71caa27b0ec37920fe574c2 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 9 Nov 2020 21:37:47 +0000 Subject: [PATCH 092/691] see: https://github.com/postfixadmin/postfixadmin/issues/390 - support a callable which allows for password validation against any external service. --- functions.inc.php | 8 ++++++ tests/PasswordValidationCallableTest.php | 32 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 tests/PasswordValidationCallableTest.php diff --git a/functions.inc.php b/functions.inc.php index e8cc0ca2..183c84ba 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -878,6 +878,14 @@ function validate_password($password) { } foreach ($val_conf as $regex => $message) { + if (is_callable($message)) { + $ret = $message($password); + if (!empty($ret)) { + $result[] = $ret; + } + continue; + } + if (!preg_match($regex, $password)) { $msgparts = preg_split("/ /", $message, 2); if (count($msgparts) == 1) { diff --git a/tests/PasswordValidationCallableTest.php b/tests/PasswordValidationCallableTest.php new file mode 100644 index 00000000..d165a3b0 --- /dev/null +++ b/tests/PasswordValidationCallableTest.php @@ -0,0 +1,32 @@ +getAll(); + + $all['password_validation'] = [ + function ($pw) { + if ($pw === 'fail') { + return 'test_fail'; + } + } + ]; + unset($all['min_password_length']); + + $c->setAll($all); + parent::setUp(); + } + + public function testBasic() + { + // anything except 'fail' should work. + $this->assertEmpty(validate_password('str')); + $this->assertEquals([], validate_password('1234asdf')); + $this->assertEquals(['test_fail'], validate_password('fail')); + } +} From 750838d7f79413a9c27f8d97b3c5f91652ca2cd1 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 9 Nov 2020 21:40:52 +0000 Subject: [PATCH 093/691] psalm fixes; make safepost()/safeget() return strings --- config.inc.php | 9 +++++++++ functions.inc.php | 14 +++++++------- public/backup.php | 4 +++- public/delete.php | 4 ++++ public/edit.php | 11 +++++++++-- public/editactive.php | 8 ++++++-- public/list-virtual.php | 11 +++++++++-- public/list.php | 28 ++++++++++++++++++---------- public/login.php | 2 +- public/users/edit-alias.php | 3 +++ public/users/login.php | 4 +++- public/users/main.php | 2 ++ public/users/password-recover.php | 6 ++++-- public/users/password.php | 2 ++ public/vacation.php | 5 +++-- 15 files changed, 83 insertions(+), 30 deletions(-) diff --git a/config.inc.php b/config.inc.php index 9abdeef3..2d8abdad 100644 --- a/config.inc.php +++ b/config.inc.php @@ -228,6 +228,15 @@ $CONF['password_validation'] = array( '/.{5}/' => 'password_too_short 5', # minimum length 5 characters '/([a-zA-Z].*){3}/' => 'password_no_characters 3', # must contain at least 3 characters '/([0-9].*){2}/' => 'password_no_digits 2', # must contain at least 2 digits + + /* support a 'callable' value which if it returns a non-empty string will be assumed to have failed. */ + + /** + * 'any-key' => function($password) { + * if ( rand(0, 5) == 0 ) { return 'password_too_short'; } + * // add some remote api check here ... or whatever + * }, + */ ); // Generate Password diff --git a/functions.inc.php b/functions.inc.php index 183c84ba..3b4f9c58 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -361,12 +361,12 @@ function escape_string($string_or_int) { * $param = safeget('param', 'default') * * @param string $param parameter name. - * @param string|array $default (optional) - default value if key is not set. - * @return string|array + * @param string $default (optional) - default value if key is not set. + * @return string */ function safeget($param, $default = "") { $retval = $default; - if (isset($_GET[$param])) { + if (isset($_GET[$param]) && is_string($_GET[$param])) { $retval = $_GET[$param]; } return $retval; @@ -377,11 +377,11 @@ function safeget($param, $default = "") { * @see safeget() * @param string $param parameter name * @param string $default (optional) default value (defaults to "") - * @return string|array - value in $_POST[$param] or $default + * @return string - value in $_POST[$param] or $default */ function safepost($param, $default = "") { $retval = $default; - if (isset($_POST[$param])) { + if (isset($_POST[$param]) && is_string($_POST[$param])) { $retval = $_POST[$param]; } return $retval; @@ -411,7 +411,7 @@ function safeserver($param, $default = "") { */ function safecookie($param, $default = "") { $retval = $default; - if (isset($_COOKIE[$param])) { + if (isset($_COOKIE[$param]) && is_string($_COOKIE[$param])) { $retval = $_COOKIE[$param]; } return $retval; @@ -426,7 +426,7 @@ function safecookie($param, $default = "") { */ function safesession($param, $default = "") { $retval = $default; - if (isset($_SESSION[$param])) { + if (isset($_SESSION[$param]) && is_string($_SESSION[$param])) { $retval = $_SESSION[$param]; } return $retval; diff --git a/public/backup.php b/public/backup.php index d8df1a77..9ec622dc 100644 --- a/public/backup.php +++ b/public/backup.php @@ -29,6 +29,8 @@ $smarty = PFASmarty::getInstance(); (($CONF['backup'] == 'NO') ? header("Location: main.php") && exit : '1'); +$version = Config::read_string('version'); + // TODO: make backup supported for postgres if (db_pgsql()) { flash_error('Sorry: Backup is currently not supported for your DBMS ('.$CONF['database_type'].').'); @@ -115,7 +117,7 @@ if ($_SERVER['REQUEST_METHOD'] == "GET") { $fields = array_keys($row); $values = array_values($row); $values = array_map(function ($str) { - return escape_string($str); + return escape_string((string) $str); }, $values); fwrite($fh, "INSERT INTO ". $tables[$i] . " (". implode(',', $fields) . ") VALUES ('" . implode('\',\'', $values) . "');\n"); diff --git a/public/delete.php b/public/delete.php index e13eb026..546216d5 100644 --- a/public/delete.php +++ b/public/delete.php @@ -29,6 +29,10 @@ $username = authentication_get_username(); # enforce login $id = safepost('delete'); $table = safepost('table'); +if (empty($table)) { + die('Invalid call'); +} + $handlerclass = ucfirst($table) . 'Handler'; if (!preg_match('/^[a-z]+$/', $table) || !file_exists(dirname(__FILE__) . "/../model/$handlerclass.php")) { # validate $table diff --git a/public/edit.php b/public/edit.php index 8aae2372..cdbe5483 100644 --- a/public/edit.php +++ b/public/edit.php @@ -29,9 +29,11 @@ $smarty = PFASmarty::getInstance(); $username = authentication_get_username(); # enforce login $table = safepost('table', safeget('table')); -if (!is_string($table)) { + +if (empty($table)) { die("Invalid table name given!"); } + $handlerclass = ucfirst($table) . 'Handler'; if (!preg_match('/^[a-z]+$/', $table) || !file_exists(dirname(__FILE__) . "/../model/$handlerclass.php")) { # validate $table @@ -103,7 +105,12 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { if (safepost('token') != $_SESSION['PFA_token']) { die('Invalid token!'); } - $inp_values = safepost('value', array()); + + $inp_values = []; + + if (isset($_POST['value']) && is_array($_POST['value'])) { + $inp_values = $_POST['value']; + } foreach ($form_fields as $key => $field) { if ($field['editable'] && $field['display_in_form']) { diff --git a/public/editactive.php b/public/editactive.php index 6de2ad05..793c5eee 100644 --- a/public/editactive.php +++ b/public/editactive.php @@ -25,10 +25,14 @@ if (safeget('token') != $_SESSION['PFA_token']) { $username = authentication_get_username(); # enforce login -$id = safeget('id'); -$table = safeget('table'); +$id = safeget('id'); +$table = safeget('table'); $active = safeget('active'); +if (empty($table)) { + die("Invalid table name given"); +} + $handlerclass = ucfirst($table) . 'Handler'; if (!preg_match('/^[a-z]+$/', $table) || !file_exists(dirname(__FILE__) . "/../model/$handlerclass.php")) { # validate $table diff --git a/public/list-virtual.php b/public/list-virtual.php index bbd053ba..a70c2fa9 100644 --- a/public/list-virtual.php +++ b/public/list-virtual.php @@ -41,7 +41,14 @@ if (safesession('list-virtual:domain') != $fDomain) { unset($_SESSION['list-virtual:limit']); } $fDisplay = (int) safepost('limit', safeget('limit', safesession('list-virtual:limit'))); -$search = safepost('search', safeget('search', array())); # not remembered in the session +$search = null; + +if (isset($_POST['search']) && is_array($_POST['search'])) { + $search = $_POST['search']; +} elseif (isset($_GET['search']) && is_array($_GET['search'])) { + $search = $_GET['search']; +} + if (!is_array($search)) { die(Config::Lang('invalid_parameter')); } @@ -62,7 +69,7 @@ if ((is_array($list_domains) and sizeof($list_domains) > 0)) { } } -if (!is_string($fDomain)) { +if (empty($fDomain)) { die(Config::Lang('invalid_parameter')); } diff --git a/public/list.php b/public/list.php index 08fd9523..fc3dfdfa 100644 --- a/public/list.php +++ b/public/list.php @@ -26,9 +26,10 @@ $smarty = PFASmarty::getInstance(); $table = safeget('table'); -if (!is_string($table)) { - die("table parameter must be a string"); +if (empty($table)) { + die("table parameter missing or invalid."); } + $handlerclass = ucfirst($table) . 'Handler'; if (!preg_match('/^[a-z]+$/', $table) || !file_exists(dirname(__FILE__) . "/../model/$handlerclass.php")) { # validate $table @@ -62,18 +63,25 @@ if ($is_admin) { } } -$search = safeget('search', safesession("search_$table", array())); -$searchmode = safeget('searchmode', safesession("searchmode_$table", array())); - -if (!is_array($search) || !is_array($searchmode)) { - # avoid injection of raw SQL if $search is a string instead of an array - die("Invalid parameter"); +$search = []; +$searchmode = []; +if (isset($_GET['search']) && is_array($_GET['search'])) { + $search = $_GET['search']; +} elseif (isset($_SESSION["search_$table"]) && is_array($_SESSION["search_$table"])) { + $search = $_SESSION["search_$table"]; } -if (safeget('reset_search', 0)) { +if (isset($_GET['searchmode']) && is_array($_GET['searchmode'])) { + $searchmode = $_GET['searchmode']; +} elseif (isset($_SESSION["searchmode_$table"]) && is_array($_SESSION["searchmode_$table"])) { + $searchmode = $_SESSION["searchmode_$table"]; +} + +if (array_key_exists('reset_search', $_GET)) { $search = array(); $searchmode = array(); } + $_SESSION["search_$table"] = $search; $_SESSION["searchmode_$table"] = $searchmode; @@ -97,7 +105,7 @@ if (count($handler->infomsg)) { if (safeget('output') == 'csv') { $out = fopen('php://output', 'w'); header('Content-Type: text/csv; charset=utf-8'); - header('Content-Disposition: attachment;filename='.$table.'.csv'); + header('Content-Disposition: attachment;filename=' . $table . '.csv'); print "\xEF\xBB\xBF"; # utf8 byte-order to indicate the file is utf8 encoded print "\n"; diff --git a/public/login.php b/public/login.php index 7b547213..debdc43b 100644 --- a/public/login.php +++ b/public/login.php @@ -91,7 +91,7 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") { session_start(); } -$_SESSION['PFA_token'] = md5(uniqid(rand(), true)); +$_SESSION['PFA_token'] = md5(uniqid("pfa" . rand(), true)); $smarty->assign('language_selector', language_selector(), false); $smarty->assign('smarty_template', 'login'); diff --git a/public/users/edit-alias.php b/public/users/edit-alias.php index 3d59e91d..fdcfd118 100644 --- a/public/users/edit-alias.php +++ b/public/users/edit-alias.php @@ -20,6 +20,9 @@ $rel_path = '../'; require_once('../common.php'); + +$smarty = PFASmarty::getInstance(); + $smarty->assign('smarty_template', 'users_edit-alias'); authentication_require_role('user'); diff --git a/public/users/login.php b/public/users/login.php index f5019c7a..49b73dd6 100644 --- a/public/users/login.php +++ b/public/users/login.php @@ -30,6 +30,8 @@ $rel_path = '../'; require_once("../common.php"); +$smarty = PFASmarty::getInstance(); + check_db_version(); # check if the database layout is up to date (and error out if not) if ($_SERVER['REQUEST_METHOD'] == "POST") { @@ -63,7 +65,7 @@ session_unset(); session_destroy(); session_start(); -$_SESSION['PFA_token'] = md5(uniqid(rand(), true)); +$_SESSION['PFA_token'] = md5(uniqid('pfa' . rand(), true)); $smarty->assign('language_selector', language_selector(), false); $smarty->assign('smarty_template', 'login'); diff --git a/public/users/main.php b/public/users/main.php index 735d4363..83275275 100644 --- a/public/users/main.php +++ b/public/users/main.php @@ -27,6 +27,8 @@ require_once('../common.php'); authentication_require_role('user'); $USERID_USERNAME = authentication_get_username(); +$smarty = PFASmarty::getInstance(); + $vh = new VacationHandler($USERID_USERNAME); if ($vh->check_vacation()) { $tummVacationtext = $PALANG['pUsersMain_vacationSet']; diff --git a/public/users/password-recover.php b/public/users/password-recover.php index 427dbd69..c4d33983 100644 --- a/public/users/password-recover.php +++ b/public/users/password-recover.php @@ -25,6 +25,8 @@ */ +$smarty = PFASmarty::getInstance(); + /* if in .../users, we need to load a different common.php; not this file is symlinked with public/ */ if (preg_match('/\/users\//', $_SERVER['REQUEST_URI'])) { $rel_path = '../'; @@ -65,8 +67,8 @@ function sendCodebySMS($to, $username, $code) { if ($_SERVER['REQUEST_METHOD'] === "POST") { $start_time = microtime(true); - $username = safepost('fUsername', null); - if (empty($username) || !is_string($username)) { + $username = safepost('fUsername'); + if (empty($username)) { die("fUsername field required"); } diff --git a/public/users/password.php b/public/users/password.php index e7e06066..0979a1cd 100644 --- a/public/users/password.php +++ b/public/users/password.php @@ -35,6 +35,8 @@ $username = authentication_get_username(); $pPassword_password_text = ""; $pPassword_password_current_text = ""; +$smarty = PFASmarty::getInstance(); + if ($_SERVER['REQUEST_METHOD'] == "POST") { if (safepost('token') != $_SESSION['PFA_token']) { die('Invalid token!'); diff --git a/public/vacation.php b/public/vacation.php index 1bd9c28e..47b4e208 100644 --- a/public/vacation.php +++ b/public/vacation.php @@ -73,7 +73,7 @@ $error = 0; $vh = new VacationHandler($fUsername); -$choice_of_reply = Config::read('vacation_choice_of_reply'); +$choice_of_reply = Config::read_array('vacation_choice_of_reply'); foreach (array_keys($choice_of_reply) as $key) { $choice_of_reply[$key] = Config::Lang($choice_of_reply[$key]); } @@ -82,6 +82,7 @@ $tUseremail = null; $tInterval_Time = null; $tBody = null; $tSubject = null; +$details = ['active' => 0]; if ($_SERVER['REQUEST_METHOD'] == "GET") { $tSubject = ''; @@ -92,7 +93,7 @@ if ($_SERVER['REQUEST_METHOD'] == "GET") { $tInterval_Time = ''; $details = $vh->get_details(); - if ($details != false) { + if (is_array($details )) { $tSubject = $details['subject']; $tBody = $details['body']; $tInterval_Time = $details['interval_time']; From 4188aa38681c0f945a1d19fa092b830653fa00ad Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 9 Nov 2020 21:49:50 +0000 Subject: [PATCH 094/691] regenerate psalm config --- psalm.xml | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/psalm.xml b/psalm.xml index df696107..ebf0cc59 100644 --- a/psalm.xml +++ b/psalm.xml @@ -1,9 +1,10 @@ @@ -31,23 +32,7 @@ - + - - - - - - - - - - - - - - - - From 2b33e8f3c3a8cf3e6e2a2c063eec4ed590338eb6 Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 9 Nov 2020 21:50:17 +0000 Subject: [PATCH 095/691] remove conditional; should be unnecessary --- public/upgrade.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/public/upgrade.php b/public/upgrade.php index 3af5e845..819e649c 100644 --- a/public/upgrade.php +++ b/public/upgrade.php @@ -3,9 +3,7 @@ # Note: run with upgrade.php?debug=1 to see all SQL error messages -if (!defined('POSTFIXADMIN')) { - require_once('common.php'); -} +require_once('common.php'); if (empty($CONF)) { die("config.inc.php seems invalid"); From 92a7042ba15958b2fef116ddbcbc5ad1387f2f1a Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Mon, 9 Nov 2020 21:56:08 +0000 Subject: [PATCH 096/691] fix typo checks --- public/list-virtual.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/list-virtual.php b/public/list-virtual.php index a70c2fa9..ae98ca8b 100644 --- a/public/list-virtual.php +++ b/public/list-virtual.php @@ -41,7 +41,7 @@ if (safesession('list-virtual:domain') != $fDomain) { unset($_SESSION['list-virtual:limit']); } $fDisplay = (int) safepost('limit', safeget('limit', safesession('list-virtual:limit'))); -$search = null; +$search = []; if (isset($_POST['search']) && is_array($_POST['search'])) { $search = $_POST['search']; @@ -69,7 +69,7 @@ if ((is_array($list_domains) and sizeof($list_domains) > 0)) { } } -if (empty($fDomain)) { +if (!is_string($fDomain)) { die(Config::Lang('invalid_parameter')); } From 897e57d4036bffb9779d71494e710d847297ea6a Mon Sep 17 00:00:00 2001 From: David Goodwin Date: Wed, 9 Dec 2020 22:52:21 +0000 Subject: [PATCH 097/691] update bootstrap to v3.4.1 --- .../css/bootstrap-datetimepicker.min.css | 5 + .../css/bootstrap-theme.css | 587 ++ .../css/bootstrap-theme.css.map | 1 + .../css/bootstrap-theme.min.css | 6 + .../css/bootstrap-theme.min.css.map | 1 + .../bootstrap-3.4.1-dist/css/bootstrap.css | 6834 +++++++++++++++++ .../css/bootstrap.css.map | 1 + .../css/bootstrap.min.css | 6 + .../css/bootstrap.min.css.map | 1 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../js/bootstrap-datetimepicker.min.js | 2 + .../css/bootstrap-3.4.1-dist/js/bootstrap.js | 2580 +++++++ .../bootstrap-3.4.1-dist/js/bootstrap.min.js | 6 + .../js/moment-with-locales.min.js | 1 + public/css/bootstrap-3.4.1-dist/js/moment.js | 4506 +++++++++++ public/css/bootstrap-3.4.1-dist/js/npm.js | 13 + public/css/bootstrap.css | 4 +- templates/header.tpl | 7 +- templates/menu.tpl | 2 +- 23 files changed, 14845 insertions(+), 6 deletions(-) create mode 100644 public/css/bootstrap-3.4.1-dist/css/bootstrap-datetimepicker.min.css create mode 100644 public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.css create mode 100644 public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map create mode 100644 public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css create mode 100644 public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map create mode 100644 public/css/bootstrap-3.4.1-dist/css/bootstrap.css create mode 100644 public/css/bootstrap-3.4.1-dist/css/bootstrap.css.map create mode 100644 public/css/bootstrap-3.4.1-dist/css/bootstrap.min.css create mode 100644 public/css/bootstrap-3.4.1-dist/css/bootstrap.min.css.map create mode 100644 public/css/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.eot create mode 100644 public/css/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.svg create mode 100644 public/css/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.ttf create mode 100644 public/css/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.woff create mode 100644 public/css/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.woff2 create mode 100644 public/css/bootstrap-3.4.1-dist/js/bootstrap-datetimepicker.min.js create mode 100644 public/css/bootstrap-3.4.1-dist/js/bootstrap.js create mode 100644 public/css/bootstrap-3.4.1-dist/js/bootstrap.min.js create mode 100644 public/css/bootstrap-3.4.1-dist/js/moment-with-locales.min.js create mode 100644 public/css/bootstrap-3.4.1-dist/js/moment.js create mode 100644 public/css/bootstrap-3.4.1-dist/js/npm.js diff --git a/public/css/bootstrap-3.4.1-dist/css/bootstrap-datetimepicker.min.css b/public/css/bootstrap-3.4.1-dist/css/bootstrap-datetimepicker.min.css new file mode 100644 index 00000000..5950ad27 --- /dev/null +++ b/public/css/bootstrap-3.4.1-dist/css/bootstrap-datetimepicker.min.css @@ -0,0 +1,5 @@ +/*! + * Datetimepicker for Bootstrap 3 + * version : 4.17.47 + * https://github.com/Eonasdan/bootstrap-datetimepicker/ + */.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{display:block;margin:2px 0;padding:4px;width:19em}@media (min-width:768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:1200px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:before,.bootstrap-datetimepicker-widget.dropdown-menu:after{content:'';display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);top:-7px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid white;top:-6px;left:8px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid white;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget .list-unstyled{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:bold;font-size:1.2em;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Increment Hours"}.bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Increment Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Decrement Hours"}.bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Decrement Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Show Hours"}.bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Show Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Toggle AM/PM"}.bootstrap-datetimepicker-widget .btn[data-action="clear"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Clear the picker"}.bootstrap-datetimepicker-widget .btn[data-action="today"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Set the date to today"}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget .picker-switch::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Toggle Date and Time Screens"}.bootstrap-datetimepicker-widget .picker-switch td{padding:0;margin:0;height:auto;width:auto;line-height:inherit}.bootstrap-datetimepicker-widget .picker-switch td span{line-height:2.5;height:2.5em;width:100%}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{text-align:center;border-radius:4px}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Previous Month"}.bootstrap-datetimepicker-widget table th.next::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Next Month"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#eee}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{font-size:.8em;height:20px;line-height:20px;color:#777}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget table td.old,.bootstrap-datetimepicker-widget table td.new{color:#777}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{content:'';display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#337ab7;border-top-color:rgba(0,0,0,0.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{display:inline-block;width:54px;height:54px;line-height:54px;margin:2px 1.5px;cursor:pointer;border-radius:4px}.bootstrap-datetimepicker-widget table td span:hover{background:#eee}.bootstrap-datetimepicker-widget table td span.active{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget table td span.old{color:#777}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.bootstrap-datetimepicker-widget.wider{width:21em}.bootstrap-datetimepicker-widget .datepicker-decades .decade{line-height:1.8em !important}.input-group.date .input-group-addon{cursor:pointer}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0} \ No newline at end of file diff --git a/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.css b/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.css new file mode 100644 index 00000000..ea33f76a --- /dev/null +++ b/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + text-shadow: 0 1px 0 #fff; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.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: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.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: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.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: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.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: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.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: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.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: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; + background-color: #e8e8e8; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + background-color: #2e6da4; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ \ No newline at end of file diff --git a/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map b/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map new file mode 100644 index 00000000..949d0973 --- /dev/null +++ b/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// stylelint-disable selector-no-qualifying-type, selector-max-compound-selectors\n\n/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default {\n .btn-styles(@btn-default-bg);\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n .box-shadow(@shadow);\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// stylelint-disable value-no-vendor-prefix, selector-max-id\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255, 255, 255, .15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css b/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css new file mode 100644 index 00000000..2a69f48c --- /dev/null +++ b/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map b/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map new file mode 100644 index 00000000..5d75106e --- /dev/null +++ b/public/css/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","dist/css/bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// stylelint-disable selector-no-qualifying-type, selector-max-compound-selectors\n\n/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default {\n .btn-styles(@btn-default-bg);\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n .box-shadow(@shadow);\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// stylelint-disable value-no-vendor-prefix, selector-max-id\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255, 255, 255, .15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/public/css/bootstrap-3.4.1-dist/css/bootstrap.css b/public/css/bootstrap-3.4.1-dist/css/bootstrap.css new file mode 100644 index 00000000..fcab4155 --- /dev/null +++ b/public/css/bootstrap-3.4.1-dist/css/bootstrap.css @@ -0,0 +1,6834 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + -moz-text-decoration: underline dotted; + text-decoration: underline dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.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: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -webkit-box-sizing: content-box; + -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"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + 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; + -webkit-box-sizing: content-box; + -moz-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 #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !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^="#"]:after, + a[href^="javascript:"]: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; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@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.woff2") format("woff2"), 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: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur: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"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -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: #333333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + 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 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.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 #eeeeee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +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: #777777; +} +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 { + padding: 0.2em; + background-color: #fcf8e3; +} +.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: #777777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 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; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; +} +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: #777777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: "\2014 \00A0"; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eeeeee; + border-left: 0; +} +.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"; +} +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; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333333; + word-break: break-all; + word-wrap: break-word; + 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 { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.row-no-gutters { + margin-right: 0; + margin-left: 0; +} +.row-no-gutters [class*="col-"] { + padding-right: 0; + padding-left: 0; +} +.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-right: 15px; + padding-left: 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%; + } +} +table { + background-color: transparent; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: 0.01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + 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; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +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; +} +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: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 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; + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + 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, -webkit-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, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.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::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eeeeee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.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-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + cursor: pointer; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.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, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .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, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.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, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.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, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.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 .form-control-static { + display: inline-block; + } + .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 { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + 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: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + opacity: 0.65; + -webkit-box-shadow: none; + box-shadow: none; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + background-image: none; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.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 { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + background-image: none; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.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 { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + background-image: none; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.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 { + 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:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + background-image: none; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.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 { + 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:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + background-image: none; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.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 { + 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:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + background-image: none; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.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 { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: 400; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.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: #23527c; + 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: #777777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + 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%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + -o-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: 400; + line-height: 1.42857143; + color: #333333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: 400; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 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: #eeeeee; +} +.nav > li.disabled > a { + color: #777777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + border-color: #337ab7; +} +.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: #eeeeee #eeeeee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.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: #337ab7; +} +.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 { + margin-bottom: 5px; + text-align: center; +} +.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-left-radius: 0; + border-top-right-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 { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + 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-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +.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; + } +} +@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; +} +.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-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.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; + padding: 9px 10px; + margin-right: 15px; + 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; + -webkit-box-shadow: none; + 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 { + padding: 10px 15px; + margin-right: -15px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.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 .form-control-static { + display: inline-block; + } + .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; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + 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-right: 15px; + margin-left: 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-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@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-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-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: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.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-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@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: #9d9d9d; + } + .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-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-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.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; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eeeeee; + border-color: #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: 0.2em 0.6em 0.3em; + font-size: 75%; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eeeeee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777777; + cursor: not-allowed; + background-color: #eeeeee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: 0.2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: 0.5; +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: -webkit-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: 0.5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: 400; + line-height: 1.42857143; + line-break: auto; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + font-size: 12px; + filter: alpha(opacity=0); + opacity: 0; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: 0.9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: 400; + line-height: 1.42857143; + line-break: auto; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + font-size: 14px; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: -webkit-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: 0.5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + outline: 0; + filter: alpha(opacity=90); + opacity: 0.9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: "\2039"; +} +.carousel-control .icon-next:before { + content: "\203a"; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.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, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.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 !important; + } + 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 !important; + } + 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 !important; + } + 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 !important; + } + 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 !important; + } + 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; + } +} +/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file diff --git a/public/css/bootstrap-3.4.1-dist/css/bootstrap.css.map b/public/css/bootstrap-3.4.1-dist/css/bootstrap.css.map new file mode 100644 index 00000000..caac3e61 --- /dev/null +++ b/public/css/bootstrap-3.4.1-dist/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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A;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIxhCD;ECkEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AI1hCD;;EC+DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIxhCD;EACE,gBAAA;EACA,8CAAA;CJ0hCD;AIvhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;CJyhCD;AIrhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJuhCD;AIjhCD;EACE,eAAA;EACA,sBAAA;CJmhCD;AIjhCC;;EAEE,eAAA;EACA,2BAAA;CJmhCH;AIhhCC;EEnDA,2CAAA;EACA,qBAAA;CNskCD;AIzgCD;EACE,UAAA;CJ2gCD;AIrgCD;EACE,uBAAA;CJugCD;AIngCD;;;;;EG1EE,eAAA;EACA,gBAAA;EACA,aAAA;CPolCD;AIvgCD;EACE,mBAAA;CJygCD;AIngCD;EACE,aAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EC+FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EE5LR,sBAAA;EACA,gBAAA;EACA,aAAA;CPomCD;AIngCD;EACE,mBAAA;CJqgCD;AI//BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJigCD;AIz/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,aAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJ2/BD;AIn/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJq/BH;AI1+BD;EACE,gBAAA;CJ4+BD;AQjoCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR6oCD;AQlpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,iBAAA;EACA,eAAA;EACA,eAAA;CRmqCH;AQ/pCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRoqCD;AQxqCD;;;;;;;;;;;;EAQI,eAAA;CR8qCH;AQ3qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRgrCD;AQprCD;;;;;;;;;;;;EAQI,eAAA;CR0rCH;AQtrCD;;EAAU,gBAAA;CR0rCT;AQzrCD;;EAAU,gBAAA;CR6rCT;AQ5rCD;;EAAU,gBAAA;CRgsCT;AQ/rCD;;EAAU,gBAAA;CRmsCT;AQlsCD;;EAAU,gBAAA;CRssCT;AQrsCD;;EAAU,gBAAA;CRysCT;AQnsCD;EACE,iBAAA;CRqsCD;AQlsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRosCD;AQlsCC;EAAA;IACE,gBAAA;GRqsCD;CACF;AQ7rCD;;EAEE,eAAA;CR+rCD;AQ5rCD;;EAEE,eAAA;EACA,0BAAA;CR8rCD;AQ1rCD;EAAuB,iBAAA;CR6rCtB;AQ5rCD;EAAuB,kBAAA;CR+rCtB;AQ9rCD;EAAuB,mBAAA;CRisCtB;AQhsCD;EAAuB,oBAAA;CRmsCtB;AQlsCD;EAAuB,oBAAA;CRqsCtB;AQlsCD;EAAuB,0BAAA;CRqsCtB;AQpsCD;EAAuB,0BAAA;CRusCtB;AQtsCD;EAAuB,2BAAA;CRysCtB;AQtsCD;EACE,eAAA;CRwsCD;AQtsCD;ECvGE,eAAA;CTgzCD;AS/yCC;;EAEE,eAAA;CTizCH;AQ1sCD;EC1GE,eAAA;CTuzCD;AStzCC;;EAEE,eAAA;CTwzCH;AQ9sCD;EC7GE,eAAA;CT8zCD;AS7zCC;;EAEE,eAAA;CT+zCH;AQltCD;EChHE,eAAA;CTq0CD;ASp0CC;;EAEE,eAAA;CTs0CH;AQttCD;ECnHE,eAAA;CT40CD;AS30CC;;EAEE,eAAA;CT60CH;AQttCD;EAGE,YAAA;EE7HA,0BAAA;CVo1CD;AUn1CC;;EAEE,0BAAA;CVq1CH;AQxtCD;EEhIE,0BAAA;CV21CD;AU11CC;;EAEE,0BAAA;CV41CH;AQ5tCD;EEnIE,0BAAA;CVk2CD;AUj2CC;;EAEE,0BAAA;CVm2CH;AQhuCD;EEtIE,0BAAA;CVy2CD;AUx2CC;;EAEE,0BAAA;CV02CH;AQpuCD;EEzIE,0BAAA;CVg3CD;AU/2CC;;EAEE,0BAAA;CVi3CH;AQnuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRquCD;AQ7tCD;;EAEE,cAAA;EACA,oBAAA;CR+tCD;AQluCD;;;;EAMI,iBAAA;CRkuCH;AQ3tCD;EACE,gBAAA;EACA,iBAAA;CR6tCD;AQztCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR4tCD;AQ9tCD;EAKI,sBAAA;EACA,mBAAA;EACA,kBAAA;CR4tCH;AQvtCD;EACE,cAAA;EACA,oBAAA;CRytCD;AQvtCD;;EAEE,wBAAA;CRytCD;AQvtCD;EACE,iBAAA;CRytCD;AQvtCD;EACE,eAAA;CRytCD;AQ5sCC;EAAA;IAEI,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGxNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXu6CC;EQttCD;IASI,mBAAA;GRgtCH;CACF;AQtsCD;;EAEE,aAAA;CRwsCD;AQrsCD;EACE,eAAA;EA9IqB,0BAAA;CRs1CtB;AQnsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRqsCD;AQhsCG;;;EACE,iBAAA;CRosCL;AQ9sCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRgsCH;AQ9rCG;;;EACE,uBAAA;CRksCL;AQ1rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,kBAAA;EACA,gCAAA;EACA,eAAA;CR4rCD;AQtrCG;;;;;;EAAW,YAAA;CR8rCd;AQ7rCG;;;;;;EACE,uBAAA;CRosCL;AQ9rCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRgsCD;AYx+CD;;;;EAIE,+DAAA;CZ0+CD;AYt+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZw+CD;AYp+CD;EACE,iBAAA;EACA,eAAA;EACA,YAAA;EACA,uBAAA;EACA,mBAAA;EACA,uDAAA;EAAA,+CAAA;CZs+CD;AY5+CD;EASI,WAAA;EACA,gBAAA;EACA,iBAAA;EACA,yBAAA;EAAA,iBAAA;CZs+CH;AYj+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,sBAAA;EACA,sBAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;CZm+CD;AY9+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZk+CH;AY79CD;EACE,kBAAA;EACA,mBAAA;CZ+9CD;AazhDD;ECHE,oBAAA;EACA,mBAAA;EACA,mBAAA;EACA,kBAAA;Cd+hDD;Aa5hDC;EAAA;IACE,aAAA;Gb+hDD;CACF;Aa9hDC;EAAA;IACE,aAAA;GbiiDD;CACF;AahiDC;EAAA;IACE,cAAA;GbmiDD;CACF;Aa1hDD;ECvBE,oBAAA;EACA,mBAAA;EACA,mBAAA;EACA,kBAAA;CdojDD;AavhDD;ECvBE,oBAAA;EACA,mBAAA;CdijDD;AavhDD;EACE,gBAAA;EACA,eAAA;CbyhDD;Aa3hDD;EAKI,iBAAA;EACA,gBAAA;CbyhDH;AczkDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECiBK,mBAAA;EAEA,gBAAA;EAEA,oBAAA;EACA,mBAAA;CfwmDL;Ac9nDA;;;;;;;;;;;;ECuCK,YAAA;CfqmDL;Ac5oDA;EC+CG,YAAA;CfgmDH;Ac/oDA;EC+CG,oBAAA;CfmmDH;AclpDA;EC+CG,oBAAA;CfsmDH;AcrpDA;EC+CG,WAAA;CfymDH;AcxpDA;EC+CG,oBAAA;Cf4mDH;Ac3pDA;EC+CG,oBAAA;Cf+mDH;Ac9pDA;EC+CG,WAAA;CfknDH;AcjqDA;EC+CG,oBAAA;CfqnDH;AcpqDA;EC+CG,oBAAA;CfwnDH;AcvqDA;EC+CG,WAAA;Cf2nDH;Ac1qDA;EC+CG,oBAAA;Cf8nDH;Ac7qDA;EC+CG,mBAAA;CfioDH;AchrDA;EC8DG,YAAA;CfqnDH;AcnrDA;EC8DG,oBAAA;CfwnDH;ActrDA;EC8DG,oBAAA;Cf2nDH;AczrDA;EC8DG,WAAA;Cf8nDH;Ac5rDA;EC8DG,oBAAA;CfioDH;Ac/rDA;EC8DG,oBAAA;CfooDH;AclsDA;EC8DG,WAAA;CfuoDH;AcrsDA;EC8DG,oBAAA;Cf0oDH;AcxsDA;EC8DG,oBAAA;Cf6oDH;Ac3sDA;EC8DG,WAAA;CfgpDH;Ac9sDA;EC8DG,oBAAA;CfmpDH;AcjtDA;EC8DG,mBAAA;CfspDH;AcptDA;ECmEG,YAAA;CfopDH;AcvtDA;ECoDG,WAAA;CfsqDH;Ac1tDA;ECoDG,mBAAA;CfyqDH;Ac7tDA;ECoDG,mBAAA;Cf4qDH;AchuDA;ECoDG,UAAA;Cf+qDH;AcnuDA;ECoDG,mBAAA;CfkrDH;ActuDA;ECoDG,mBAAA;CfqrDH;AczuDA;ECoDG,UAAA;CfwrDH;Ac5uDA;ECoDG,mBAAA;Cf2rDH;Ac/uDA;ECoDG,mBAAA;Cf8rDH;AclvDA;ECoDG,UAAA;CfisDH;AcrvDA;ECoDG,mBAAA;CfosDH;AcxvDA;ECoDG,kBAAA;CfusDH;Ac3vDA;ECyDG,WAAA;CfqsDH;Ac9vDA;ECwEG,kBAAA;CfyrDH;AcjwDA;ECwEG,0BAAA;Cf4rDH;AcpwDA;ECwEG,0BAAA;Cf+rDH;AcvwDA;ECwEG,iBAAA;CfksDH;Ac1wDA;ECwEG,0BAAA;CfqsDH;Ac7wDA;ECwEG,0BAAA;CfwsDH;AchxDA;ECwEG,iBAAA;Cf2sDH;AcnxDA;ECwEG,0BAAA;Cf8sDH;ActxDA;ECwEG,0BAAA;CfitDH;AczxDA;ECwEG,iBAAA;CfotDH;Ac5xDA;ECwEG,0BAAA;CfutDH;Ac/xDA;ECwEG,yBAAA;Cf0tDH;AclyDA;ECwEG,gBAAA;Cf6tDH;Aa5tDD;ECzEC;;;;;;;;;;;;ICuCK,YAAA;Gf6wDH;EcpzDF;IC+CG,YAAA;GfwwDD;EcvzDF;IC+CG,oBAAA;Gf2wDD;Ec1zDF;IC+CG,oBAAA;Gf8wDD;Ec7zDF;IC+CG,WAAA;GfixDD;Ech0DF;IC+CG,oBAAA;GfoxDD;Ecn0DF;IC+CG,oBAAA;GfuxDD;Ect0DF;IC+CG,WAAA;Gf0xDD;Ecz0DF;IC+CG,oBAAA;Gf6xDD;Ec50DF;IC+CG,oBAAA;GfgyDD;Ec/0DF;IC+CG,WAAA;GfmyDD;Ecl1DF;IC+CG,oBAAA;GfsyDD;Ecr1DF;IC+CG,mBAAA;GfyyDD;Ecx1DF;IC8DG,YAAA;Gf6xDD;Ec31DF;IC8DG,oBAAA;GfgyDD;Ec91DF;IC8DG,oBAAA;GfmyDD;Ecj2DF;IC8DG,WAAA;GfsyDD;Ecp2DF;IC8DG,oBAAA;GfyyDD;Ecv2DF;IC8DG,oBAAA;Gf4yDD;Ec12DF;IC8DG,WAAA;Gf+yDD;Ec72DF;IC8DG,oBAAA;GfkzDD;Ech3DF;IC8DG,oBAAA;GfqzDD;Ecn3DF;IC8DG,WAAA;GfwzDD;Ect3DF;IC8DG,oBAAA;Gf2zDD;Ecz3DF;IC8DG,mBAAA;Gf8zDD;Ec53DF;ICmEG,YAAA;Gf4zDD;Ec/3DF;ICoDG,WAAA;Gf80DD;Ecl4DF;ICoDG,mBAAA;Gfi1DD;Ecr4DF;ICoDG,mBAAA;Gfo1DD;Ecx4DF;ICoDG,UAAA;Gfu1DD;Ec34DF;ICoDG,mBAAA;Gf01DD;Ec94DF;ICoDG,mBAAA;Gf61DD;Ecj5DF;ICoDG,UAAA;Gfg2DD;Ecp5DF;ICoDG,mBAAA;Gfm2DD;Ecv5DF;ICoDG,mBAAA;Gfs2DD;Ec15DF;ICoDG,UAAA;Gfy2DD;Ec75DF;ICoDG,mBAAA;Gf42DD;Ech6DF;ICoDG,kBAAA;Gf+2DD;Ecn6DF;ICyDG,WAAA;Gf62DD;Ect6DF;ICwEG,kBAAA;Gfi2DD;Ecz6DF;ICwEG,0BAAA;Gfo2DD;Ec56DF;ICwEG,0BAAA;Gfu2DD;Ec/6DF;ICwEG,iBAAA;Gf02DD;Ecl7DF;ICwEG,0BAAA;Gf62DD;Ecr7DF;ICwEG,0BAAA;Gfg3DD;Ecx7DF;ICwEG,iBAAA;Gfm3DD;Ec37DF;ICwEG,0BAAA;Gfs3DD;Ec97DF;ICwEG,0BAAA;Gfy3DD;Ecj8DF;ICwEG,iBAAA;Gf43DD;Ecp8DF;ICwEG,0BAAA;Gf+3DD;Ecv8DF;ICwEG,yBAAA;Gfk4DD;Ec18DF;ICwEG,gBAAA;Gfq4DD;CACF;Aa53DD;EClFC;;;;;;;;;;;;ICuCK,YAAA;Gfs7DH;Ec79DF;IC+CG,YAAA;Gfi7DD;Ech+DF;IC+CG,oBAAA;Gfo7DD;Ecn+DF;IC+CG,oBAAA;Gfu7DD;Ect+DF;IC+CG,WAAA;Gf07DD;Ecz+DF;IC+CG,oBAAA;Gf67DD;Ec5+DF;IC+CG,oBAAA;Gfg8DD;Ec/+DF;IC+CG,WAAA;Gfm8DD;Ecl/DF;IC+CG,oBAAA;Gfs8DD;Ecr/DF;IC+CG,oBAAA;Gfy8DD;Ecx/DF;IC+CG,WAAA;Gf48DD;Ec3/DF;IC+CG,oBAAA;Gf+8DD;Ec9/DF;IC+CG,mBAAA;Gfk9DD;EcjgEF;IC8DG,YAAA;Gfs8DD;EcpgEF;IC8DG,oBAAA;Gfy8DD;EcvgEF;IC8DG,oBAAA;Gf48DD;Ec1gEF;IC8DG,WAAA;Gf+8DD;Ec7gEF;IC8DG,oBAAA;Gfk9DD;EchhEF;IC8DG,oBAAA;Gfq9DD;EcnhEF;IC8DG,WAAA;Gfw9DD;EcthEF;IC8DG,oBAAA;Gf29DD;EczhEF;IC8DG,oBAAA;Gf89DD;Ec5hEF;IC8DG,WAAA;Gfi+DD;Ec/hEF;IC8DG,oBAAA;Gfo+DD;EcliEF;IC8DG,mBAAA;Gfu+DD;EcriEF;ICmEG,YAAA;Gfq+DD;EcxiEF;ICoDG,WAAA;Gfu/DD;Ec3iEF;ICoDG,mBAAA;Gf0/DD;Ec9iEF;ICoDG,mBAAA;Gf6/DD;EcjjEF;ICoDG,UAAA;GfggED;EcpjEF;ICoDG,mBAAA;GfmgED;EcvjEF;ICoDG,mBAAA;GfsgED;Ec1jEF;ICoDG,UAAA;GfygED;Ec7jEF;ICoDG,mBAAA;Gf4gED;EchkEF;ICoDG,mBAAA;Gf+gED;EcnkEF;ICoDG,UAAA;GfkhED;EctkEF;ICoDG,mBAAA;GfqhED;EczkEF;ICoDG,kBAAA;GfwhED;Ec5kEF;ICyDG,WAAA;GfshED;Ec/kEF;ICwEG,kBAAA;Gf0gED;EcllEF;ICwEG,0BAAA;Gf6gED;EcrlEF;ICwEG,0BAAA;GfghED;EcxlEF;ICwEG,iBAAA;GfmhED;Ec3lEF;ICwEG,0BAAA;GfshED;Ec9lEF;ICwEG,0BAAA;GfyhED;EcjmEF;ICwEG,iBAAA;Gf4hED;EcpmEF;ICwEG,0BAAA;Gf+hED;EcvmEF;ICwEG,0BAAA;GfkiED;Ec1mEF;ICwEG,iBAAA;GfqiED;Ec7mEF;ICwEG,0BAAA;GfwiED;EchnEF;ICwEG,yBAAA;Gf2iED;EcnnEF;ICwEG,gBAAA;Gf8iED;CACF;Aa5hED;EC3FC;;;;;;;;;;;;ICuCK,YAAA;Gf+lEH;EctoEF;IC+CG,YAAA;Gf0lED;EczoEF;IC+CG,oBAAA;Gf6lED;Ec5oEF;IC+CG,oBAAA;GfgmED;Ec/oEF;IC+CG,WAAA;GfmmED;EclpEF;IC+CG,oBAAA;GfsmED;EcrpEF;IC+CG,oBAAA;GfymED;EcxpEF;IC+CG,WAAA;Gf4mED;Ec3pEF;IC+CG,oBAAA;Gf+mED;Ec9pEF;IC+CG,oBAAA;GfknED;EcjqEF;IC+CG,WAAA;GfqnED;EcpqEF;IC+CG,oBAAA;GfwnED;EcvqEF;IC+CG,mBAAA;Gf2nED;Ec1qEF;IC8DG,YAAA;Gf+mED;Ec7qEF;IC8DG,oBAAA;GfknED;EchrEF;IC8DG,oBAAA;GfqnED;EcnrEF;IC8DG,WAAA;GfwnED;EctrEF;IC8DG,oBAAA;Gf2nED;EczrEF;IC8DG,oBAAA;Gf8nED;Ec5rEF;IC8DG,WAAA;GfioED;Ec/rEF;IC8DG,oBAAA;GfooED;EclsEF;IC8DG,oBAAA;GfuoED;EcrsEF;IC8DG,WAAA;Gf0oED;EcxsEF;IC8DG,oBAAA;Gf6oED;Ec3sEF;IC8DG,mBAAA;GfgpED;Ec9sEF;ICmEG,YAAA;Gf8oED;EcjtEF;ICoDG,WAAA;GfgqED;EcptEF;ICoDG,mBAAA;GfmqED;EcvtEF;ICoDG,mBAAA;GfsqED;Ec1tEF;ICoDG,UAAA;GfyqED;Ec7tEF;ICoDG,mBAAA;Gf4qED;EchuEF;ICoDG,mBAAA;Gf+qED;EcnuEF;ICoDG,UAAA;GfkrED;EctuEF;ICoDG,mBAAA;GfqrED;EczuEF;ICoDG,mBAAA;GfwrED;Ec5uEF;ICoDG,UAAA;Gf2rED;Ec/uEF;ICoDG,mBAAA;Gf8rED;EclvEF;ICoDG,kBAAA;GfisED;EcrvEF;ICyDG,WAAA;Gf+rED;EcxvEF;ICwEG,kBAAA;GfmrED;Ec3vEF;ICwEG,0BAAA;GfsrED;Ec9vEF;ICwEG,0BAAA;GfyrED;EcjwEF;ICwEG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","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: none;\n text-decoration: underline;\n text-decoration: underline dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"../fonts/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/glyphicons-halflings-regular.woff2\") format(\"woff2\"), 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\");\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: 400;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: \"\\2014 \\00A0\";\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: \"\";\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: \"\\00A0 \\2014\";\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.row-no-gutters [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1,\n .col-sm-2,\n .col-sm-3,\n .col-sm-4,\n .col-sm-5,\n .col-sm-6,\n .col-sm-7,\n .col-sm-8,\n .col-sm-9,\n .col-sm-10,\n .col-sm-11,\n .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1,\n .col-md-2,\n .col-md-3,\n .col-md-4,\n .col-md-5,\n .col-md-6,\n .col-md-7,\n .col-md-8,\n .col-md-9,\n .col-md-10,\n .col-md-11,\n .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1,\n .col-lg-2,\n .col-lg-3,\n .col-lg-4,\n .col-lg-5,\n .col-lg-6,\n .col-lg-7,\n .col-lg-8,\n .col-lg-9,\n .col-lg-10,\n .col-lg-11,\n .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: 0.01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: 700;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-appearance: none;\n appearance: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n background-image: none;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: 400;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: 400;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-right: 15px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-right: -15px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: 0.2em 0.6em 0.3em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #eeeeee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: 0.2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 12px;\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: \"\\2039\";\n}\n.carousel-control .icon-next:before {\n content: \"\\203a\";\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable\n\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// 1. Remove the bottom border in Chrome 57- and Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n//\n\nabbr[title] {\n border-bottom: none; // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important; // Black prints faster: h5bp.com/s\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n}\n","// stylelint-disable value-list-comma-newline-after, value-list-comma-space-after, indentation, declaration-colon-newline-after, font-family-no-missing-generic-family-keyword\n\n//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"@{icon-font-path}@{icon-font-name}.eot\");\n src: url(\"@{icon-font-path}@{icon-font-name}.eot?#iefix\") format(\"embedded-opentype\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff2\") format(\"woff2\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff\") format(\"woff\"),\n url(\"@{icon-font-path}@{icon-font-name}.ttf\") format(\"truetype\"),\n url(\"@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}\") format(\"svg\");\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// https://getbootstrap.com/docs/3.4/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// stylelint-disable media-feature-name-no-vendor-prefix, media-feature-parentheses-space-inside, media-feature-name-no-unknown, indentation, at-rule-name-space-after\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","// stylelint-disable selector-list-comma-newline-after, selector-no-qualifying-type\n\n//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: 400;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n padding: .2em;\n background-color: @state-warning-bg;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: \"\\2014 \\00A0\"; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: \"\"; }\n &:after {\n content: \"\\00A0 \\2014\"; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n color: @pre-color;\n word-break: break-all;\n word-wrap: break-word;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n padding-right: ceil((@gutter / 2));\n padding-left: floor((@gutter / 2));\n margin-right: auto;\n margin-left: auto;\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-right: floor((@gutter / -2));\n margin-left: ceil((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-right: floor((@grid-gutter-width / 2));\n padding-left: ceil((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","// stylelint-disable selector-max-type, selector-max-compound-selectors, selector-no-qualifying-type\n\n//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n\n // Table cell sizing\n //\n // Reset default table behavior\n\n col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-column;\n float: none;\n }\n\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-cell;\n float: none;\n }\n }\n}\n\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\n\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n min-height: .01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n overflow-x: auto;\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * .75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type, property-no-vendor-prefix, media-feature-name-no-vendor-prefix\n\n//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: 700;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\ninput[type=\"search\"] {\n // Override content-box in Normalize (* isn't specific enough)\n .box-sizing(border-box);\n\n // Search inputs in iOS\n //\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n -webkit-appearance: none;\n appearance: none;\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n\n // Apply same disabled cursor tweak as for inputs\n // Some special care is needed because