diff --git a/.idea/dataSources.ids b/.idea/dataSources.ids index 1de6252e..ed70511d 100644 --- a/.idea/dataSources.ids +++ b/.idea/dataSources.ids @@ -3573,6 +3573,55 @@ + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + +
+ + + + + + + + + + + + + +
@@ -3582,16 +3631,73 @@
- +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + - + + + + +
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index a0599aaa..a8755ed6 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -1,6 +1,6 @@ - + mysql true diff --git a/.idea/dictionaries/exodus4d.xml b/.idea/dictionaries/exodus4d.xml index 037e19bf..4a428934 100644 --- a/.idea/dictionaries/exodus4d.xml +++ b/.idea/dictionaries/exodus4d.xml @@ -18,6 +18,7 @@ killmail mouseover nonblock + onerror pnotify raphaƫl revalidate diff --git a/app/app/cortex.php b/app/app/cortex.php new file mode 100644 index 00000000..6b5cabcb --- /dev/null +++ b/app/app/cortex.php @@ -0,0 +1,54 @@ +set('AUTOLOAD', $f3->get('AUTOLOAD').';app/cortex/'); + $f3->set('QUIET', false); + + $dbs = array( + 'sql' => new \DB\SQL('mysql:host=localhost;port=3306;dbname=fatfree', 'fatfree', ''), +// 'sql-sqlite' => new \DB\SQL('sqlite:data/sqlite.db'), +// 'sql-pgsql' => new \DB\SQL('pgsql:host=localhost;dbname=fatfree', 'fatfree', 'fatfree'), + 'jig' => new \DB\Jig('data/'), + 'mongo' => new \DB\Mongo('mongodb://localhost:27017', 'testdb'), +// 'sqlsrv2012' => new \DB\SQL('sqlsrv:SERVER=LOCALHOST\SQLEXPRESS2012;Database=fatfree','fatfree', 'fatfree'), +// 'sqlsrv2008' => new \DB\SQL('sqlsrv:SERVER=LOCALHOST\SQLEXPRESS2008;Database=fatfree','fatfree', 'fatfree'), + ); + $results = array(); + + // Test Syntax + foreach ($dbs as $type => $db) { + $test = new \Test_Syntax(); + $results = array_merge((array) $results, (array) $test->run($db, $type)); + } + + // Test Relations + foreach ($dbs as $type => $db) { + $f3->set('DB',$db); + $test = new \Test_Relation(); + $results = array_merge((array) $results, (array) $test->run($db, $type)); + } + + // Test Filter + foreach ($dbs as $type => $db) { + $f3->set('DB',$db); + $test = new \Test_Filter(); + $results = array_merge((array) $results, (array) $test->run($db, $type)); + } + + // Further Common Tests + if (isset($dbs['sql'])) { + $test = new \Test_Common(); + $f3->set('DB', $dbs['sql']); + $results = array_merge((array) $results, (array) $test->run()); + } + $f3->set('results', $results); + } + + +} \ No newline at end of file diff --git a/app/app/cortex/authormodel.php b/app/app/cortex/authormodel.php new file mode 100644 index 00000000..0aa19264 --- /dev/null +++ b/app/app/cortex/authormodel.php @@ -0,0 +1,27 @@ + array( + 'type' => \DB\SQL\Schema::DT_VARCHAR256 + ), + 'mail' => array( + 'type' => \DB\SQL\Schema::DT_VARCHAR256 + ), + 'website' => array( + 'type' => \DB\SQL\Schema::DT_VARCHAR256 + ), + 'news' => array( + 'has-many' => array('\NewsModel','author'), + ), + 'profile' => array( + 'has-one' => array('\ProfileModel','author'), + ), + ), +// $primary = 'aid', + $table = 'author', + $db = 'DB'; + +} diff --git a/app/app/cortex/newsmodel.php b/app/app/cortex/newsmodel.php new file mode 100644 index 00000000..33b6ccff --- /dev/null +++ b/app/app/cortex/newsmodel.php @@ -0,0 +1,28 @@ + array( + 'type' => \DB\SQL\Schema::DT_VARCHAR128 + ), + 'text' => array( + 'type' => \DB\SQL\Schema::DT_TEXT + ), + 'author' => array( + 'belongs-to-one' => '\AuthorModel', + ), + 'tags' => array( + 'belongs-to-many' => '\TagModel', + ), + 'tags2' => array( + 'has-many' => array('\TagModel','news','news_tags'), +// 'has-many' => array('\TagModel','news'), + ), + ), +// $primary='nid', + $table = 'news', + $db = 'DB'; + +} \ No newline at end of file diff --git a/app/app/cortex/profilemodel.php b/app/app/cortex/profilemodel.php new file mode 100644 index 00000000..e749cf33 --- /dev/null +++ b/app/app/cortex/profilemodel.php @@ -0,0 +1,21 @@ + array( + 'type' => \DB\SQL\Schema::DT_TEXT + ), + 'image' => array( + 'type' => \DB\SQL\Schema::DT_VARCHAR256 + ), + 'author' => array( + 'belongs-to-one' => '\AuthorModel' + ) + ), +// $primary = 'profile_id', + $table = 'profile', + $db = 'DB'; + +} \ No newline at end of file diff --git a/app/app/cortex/tagmodel.php b/app/app/cortex/tagmodel.php new file mode 100644 index 00000000..668bd34e --- /dev/null +++ b/app/app/cortex/tagmodel.php @@ -0,0 +1,18 @@ + array( + 'type' => \DB\SQL\Schema::DT_VARCHAR128 + ), + 'news' => array( + 'has-many' => array('\NewsModel','tags2','news_tags'), + ), + ), +// $primary = 'tid', + $table = 'tags', + $db = 'DB'; + +} \ No newline at end of file diff --git a/app/app/cortex/test_common.php b/app/app/cortex/test_common.php new file mode 100644 index 00000000..bdcc7477 --- /dev/null +++ b/app/app/cortex/test_common.php @@ -0,0 +1,125 @@ +load(); + + $dummy = array( + 'title'=>'copy test', + 'text'=>'Lorem ipsum dolor sit amet.', + 'author'=>1, + 'tags'=>array(3) + ); + $f3->set('record1', $dummy); + $news->copyto('record2'); + + $test->expect( + $f3->exists('record2'), + 'copyto: raw record copied to hive' + ); + + $news->reset(); + + $news->copyfrom('record1'); + + $test->expect( + $news->title = 'copy test' && + $news->text = 'Lorem ipsum dolor sit amet.', + 'copyfrom: hydrate from hive key' + ); + $test->expect( + $news->author instanceof AuthorModel + && !$news->author->dry() && + $news->tags instanceof \DB\CortexCollection, + 'copyfrom: relations hydrated successful' + ); + + $test->expect( + $news->get('author',true) == 1, + 'get raw data from relational field' + ); + + $news->reset(); + $news->copyfrom('record2','title;author'); + + $test->expect( + $news->title = 'Responsive Images' && + $news->get('author',true) == 2 && + $news->text == NULL, + 'copyfrom: limit fields with split-able string' + ); + + $news->reset(); + $news->copyfrom('record2',array('title')); + + $test->expect( + $news->title = 'Responsive Images' && $news->text == NULL, + 'copyfrom: limit fields by array' + ); + + $news->reset(); + $news->copyfrom($dummy,function($fields) { + return array_intersect_key($fields,array_flip(array('title'))); + }); + + $test->expect( + $news->title = 'copy test', + 'copyfrom: copy from array instead of hive key' + ); + + $test->expect( + $news->title = 'copy test' && $news->text == NULL, + 'copyfrom: limit fields by callback function' + ); + + $all = $news->find(); + $allTitle = $all->getAll('title'); + + $test->expect( + count($allTitle) == 3 && + $allTitle[0] == 'Responsive Images' && + $allTitle[1] == 'CSS3 Showcase' && + $allTitle[2] == 'Touchable Interfaces', + 'collection getAll returns all values of selected field' + ); + + $newsByID = $all->getBy('_id'); + $test->expect( + array_keys($newsByID) == array(1,2,3), + 'collection getBy sorts by given field' + ); + + $newsByAuthorID = $all->getBy('author',true); + $test->expect( + array_keys($newsByAuthorID) == array(2, 1) && + count($newsByAuthorID[2]) == 2 && + count($newsByAuthorID[1]) == 1, + 'collection getBy nested sort by author' + ); + + $allTitle = array(); + foreach($all as $record) + $allTitle[] = $record->title; + + $test->expect( + count($allTitle) == 3 && + $allTitle[0] == 'Responsive Images' && + $allTitle[1] == 'CSS3 Showcase' && + $allTitle[2] == 'Touchable Interfaces', + 'collection is traversable' + ); + + + /////////////////////////////////// + return $test->results(); + } +} \ No newline at end of file diff --git a/app/app/cortex/test_filter.php b/app/app/cortex/test_filter.php new file mode 100644 index 00000000..9047cfea --- /dev/null +++ b/app/app/cortex/test_filter.php @@ -0,0 +1,302 @@ +find()->getAll('_id'); + $all = $news->find(); + $newsIDs = $all->getAll('_id'); + $profileIDs = $profile->find()->getAll('_id'); + $tagIDs = $tag->find()->getAll('_id'); + + // add another relation + $news->load(array('title = ?','CSS3 Showcase')); + $news->author = $author->load(array($author_pk.' = ?',$authorIDs[0])); + $news->save(); + $news->reset(); + $author->reset(); + + + // has-filter on belongs-to relation + /////////////////////////////////// + + $result = $author->has('news', array('title like ?', '%Image%'))->afind(); + + $test->expect( + count($result) == 1 && + $result[0]['name'] == 'Johnny English', + $type.': has filter on many-to-one field' + ); + $test->expect( + count($result[0]['news']) == 2 && + $result[0]['news'][0]['title'] == 'Responsive Images' && + $result[0]['news'][1]['title'] == 'CSS3 Showcase', + $type.': has filter does not prune relation set' + ); + + $result = $news->has('author', array('name = ?', 'Johnny English'))->afind(); + $test->expect( + count($result) == 2 && // has 2 news + $result[0]['title'] == 'Responsive Images' && + $result[1]['title'] == 'CSS3 Showcase', + $type.': has filter on one-to-many field' + ); + + // add another profile + $profile->message = 'Beam me up, Scotty!'; + $profile->author = $authorIDs[2]; + $profile->save(); + $profile->reset(); + + $result = $author->has('profile',array('message LIKE ?','%Scotty%'))->afind(); + $test->expect( + count($result) == 1 && + $result[0]['name'] == 'James T. Kirk' && + $result[0]['profile']['message'] == 'Beam me up, Scotty!', + $type.': has filter on one-to-one field' + ); + + $result = $profile->has('author',array('name LIKE ?','%Kirk%'))->afind(); + $test->expect( + count($result) == 1 && + $result[0]['message'] == 'Beam me up, Scotty!' && + $result[0]['author']['name'] == 'James T. Kirk', + $type.': has filter on one-to-one field, inverse' + ); + + // add mm tags + $news->load(array('title = ?','Responsive Images')); + $news->tags2 = array($tagIDs[0],$tagIDs[1]); + $news->save(); + $news->load(array('title = ?','CSS3 Showcase')); + $news->tags2 = array($tagIDs[1],$tagIDs[2]); + $news->save(); + $news->reset(); + + $result = $news->has('tags2',array('title like ?','%Design%'))->find(); + $test->expect( + count($result) == 1 && + $result[0]['title'] == 'Responsive Images', + $type.': has filter on many-to-many field' + ); + + $result = $news->has('tags2',array('title = ?','Responsive'))->find(); + $test->expect( + count($result) == 2 && + $result[0]['title'] == 'Responsive Images' && + $result[1]['title'] == 'CSS3 Showcase', + $type.': has filter on many-to-many field, additional test' + ); + + + $result = $tag->has('news',array('title = ?','Responsive Images'))->find(); + $test->expect( + count($result) == 2 && + $result[0]['title'] == 'Web Design' && + $result[1]['title'] == 'Responsive', + $type.': has filter on many-to-many field, inverse' + ); + + // add another tag + $news->load(array('title = ?', 'Touchable Interfaces')); + $news->tags2 = array($tagIDs[1]); + $news->save(); + $news->reset(); + + $tag->has('news',array('text LIKE ? and title LIKE ?', '%Lorem%', '%Interface%')); + $result = $tag->find(); + $test->expect( + count($result) == 1 && + $result[0]['title'] == 'Responsive', + $type.': has filter with multiple conditions' + ); + + $news->has('tags2', array('title = ? OR title = ?', 'Usability', 'Web Design')); + $result = $news->afind(array('text = ?', 'Lorem Ipsun')); + $test->expect( + count($result) == 1 && + $result[0]['title'] == 'Responsive Images', + $type.': find with condition and has filter' + ); + + $news->load(array('title = ?', 'Responsive Images')); + $news->author = $authorIDs[1]; + $news->save(); + $news->reset(); + + + $news->has('tags2', array('title = ? OR title = ?', 'Usability', 'Web Design')); + $news->has('author', array('name = ?', 'Ridley Scott')); + $result = $news->afind(); + $test->expect( + count($result) == 1 && + $result[0]['title'] == 'Responsive Images', + $type.': find with multiple has filters on different relations' + ); + + // add another news to author 2 + $news->load(array($news_pk.' = ?',$newsIDs[2])); + $news->author = $authorIDs[1]; + $news->save(); + + $news->reset(); + $news->has('author', array('name = ?', 'Ridley Scott')); + $news->load(); + $res = array(); + while (!$news->dry()) { + $res[] = $news->title; + $news->next(); + } + + $test->expect( + count($res) == 2 && + $res[0] == 'Responsive Images' && + $res[1] == 'Touchable Interfaces' + , + $type.': has filter in load context' + ); + + $news->reset(); + $news->fields(array('title')); + $news->load(); + + $test->expect( + !empty($news->title) && + empty($news->author) && + empty($news->text) && + empty($news->tags) && + empty($news->tags2), + $type.': use a whitelist to restrict fields' + ); + + unset($news); + $news = new \NewsModel(); + + $news->fields(array('title','tags','tags2','author'),true); + $news->load(); + + $test->expect( + empty($news->title) && + empty($news->author) && + !empty($news->text) && + empty($news->tags) && + empty($news->tags2), + $type.': use a blacklist to restrict fields' + ); + + unset($news); + $news = new \NewsModel(); + + $news->fields(array('tags.title')); + $news->load(); + + $test->expect( + !empty($news->tags[0]->title) && + empty($news->tags[0]->news), + $type.': set restricted fields to related mappers' + ); + + $news->filter('tags2',null,array('order'=>'title ASC')); + $news->load(array('title = ?','Responsive Images')); + $test->expect( + $news->tags2[0]->title == 'Responsive' && + $news->tags2[1]->title == 'Web Design', + $type.': filter with sorting of related records' + ); + + // get all tags sorted by their usage in news articles + $tag->reset(); + $tag->countRel('news'); + $result = $tag->find(null,array('order'=>'count_news DESC, title'))->castAll(0); + + $test->expect( + $result[0]['title'] == 'Responsive' && + $result[0]['count_news'] == 3 && + $result[1]['title'] == 'Usability' && + $result[1]['count_news'] == 1 && + $result[2]['title'] == 'Web Design' && + $result[2]['count_news'] == 1, + $type.': count and sort on many-to-many relation' + ); + + // get all authors sorted by the amount of news they have written + $author->reset(); + $author->countRel('news'); + $result = $author->find(null,array('order'=>'count_news DESC'))->castAll(0); + + $test->expect( + $result[0]['name'] == 'Ridley Scott' && + $result[0]['count_news'] == 2 && + $result[1]['name'] == 'Johnny English' && + $result[1]['count_news'] == 1 && + $result[2]['name'] == 'James T. Kirk' && + $result[2]['count_news'] == null, + $type.': count and sort on one-to-many relation' + ); + + $tag->reset(); + $tag->countRel('news'); + $result = $tag->find(null,array('order'=>'count_news DESC, title DESC','limit'=>1,'offset'=>1))->castAll(0); + + $test->expect( + $result[0]['title'] == 'Web Design' && + $result[0]['count_news'] == 1, + $type.': apply limit and offset on aggregated collection' + ); + + + $author->reset(); + $author->countRel('news'); + $author->has('news',array('text like ?','%Lorem%')); + $result = $author->find()->castAll(0); + + $test->expect( + count($result) == 1 && + $result[0]['name'] == 'Ridley Scott' && + $result[0]['count_news'] == 2 , + $type.': has-filter and 1:M relation counter' + ); + + + $author->reset(); + $id = $author->load()->next()->_id; + $tag->reset(); + $tag->countRel('news'); + $tag->has('news',array('author = ?',$id)); + $result = $tag->find(null,array('order'=>'count_news desc'))->castAll(0); + + $test->expect( + count($result) == 2 && + $result[0]['title'] == 'Responsive' && + $result[0]['count_news'] == 3 && + $result[1]['title'] == 'Web Design' && + $result[1]['count_news'] == 1, + $type.': has-filter and M:M relation counter' + ); + + /////////////////////////////////// + return $test->results(); + } + +} \ No newline at end of file diff --git a/app/app/cortex/test_relation.php b/app/app/cortex/test_relation.php new file mode 100644 index 00000000..08d319ab --- /dev/null +++ b/app/app/cortex/test_relation.php @@ -0,0 +1,335 @@ +cast(); + unset($row['_id']); + unset($row['id']); + unset($row['aid']); + unset($row['uid']); + unset($row['nid']); + unset($row['tid']); + unset($row['pid']); + unset($row['profile_id']); + foreach ($row as $col => $val) { + if (empty($val) || is_null($val)) + unset($row[$col]); + } + $out[] = $row; + } + return $out; + } + + function run($db,$type) + { + $test = new \Test(); + + // clear existing data + \AuthorModel::setdown(); + \TagModel::setdown(); + \NewsModel::setdown(); + \ProfileModel::setdown(); + + // setup models + \AuthorModel::setup(); + \TagModel::setup(); + \NewsModel::setup(); + \ProfileModel::setup(); + + // setup Author + /////////////////////////////////// + $author_id = array(); + + $author = new \AuthorModel(); + $ac=$author::resolveConfiguration(); + $author_pk = (is_int(strpos($type,'sql'))?$ac['primary']:'_id'); + + $author->name = 'Johnny English'; + $author->save(); + $author_id[] = $author->_id; + $author->reset(); + $author->name = 'Ridley Scott'; + $author->save(); + $author_id[] = $author->_id; + $author->reset(); + $author->name = 'James T. Kirk'; + $author->save(); + $author_id[] = $author->_id; + $author->reset(); + + $allauthors = $author->find()->castAll(); + $allauthors = $this->getResult($allauthors); + $test->expect( + json_encode($allauthors) == + '[{"name":"Johnny English"},{"name":"Ridley Scott"},{"name":"James T. Kirk"}]', + $type.': all AuthorModel items created' + ); + + // setup Tags + /////////////////////////////////// + $tag_id = array(); + + $tag = new \TagModel(); + $tc=$tag::resolveConfiguration(); + $tag_pk = (is_int(strpos($type,'sql'))?$tc['primary']:'_id'); + + $tag->title = 'Web Design'; + $tag->save(); + $tag_id[] = $tag->_id; + $tag->reset(); + $tag->title = 'Responsive'; + $tag->save(); + $tag_id[] = $tag->_id; + $tag->reset(); + $tag->title = 'Usability'; + $tag->save(); + $tag_id[] = $tag->_id; + $tag->reset(); + + $allTags = $this->getResult($tag->find()); + $test->expect( + json_encode($allTags) == + '[{"title":"Web Design"},{"title":"Responsive"},{"title":"Usability"}]', + $type.': all TagModel items created' + ); + + // setup News + /////////////////////////////////// + $news_id = array(); + + $news = new \NewsModel(); + $nc=$news::resolveConfiguration(); + $news_pk = (is_int(strpos($type,'sql'))?$nc['primary']:'_id'); + + $news->title = 'Responsive Images'; + $news->text = 'Lorem Ipsun'; + $news->save(); + $news_id[] = $news->_id; + $news->reset(); + $news->title = 'CSS3 Showcase'; + $news->text = 'News Text 2'; + $news->save(); + $news_id[] = $news->_id; + $news->reset(); + $news->title = 'Touchable Interfaces'; + $news->text = 'Lorem Foo'; + $news->save(); + $news_id[] = $news->_id; + $news->reset(); + + $allnews = $this->getResult($news->find()); + $test->expect( + json_encode($allnews) == + '[{"title":"Responsive Images","text":"Lorem Ipsun"},{"title":"CSS3 Showcase","text":"News Text 2"},{"title":"Touchable Interfaces","text":"Lorem Foo"}]', + $type.': all NewsModel items created' + ); + + // belongs-to author relation + /////////////////////////////////// + + $author->load(); + $news->load(array($news_pk.' = ?',$news_id[0])); + $news->author = $author; + $news->save(); + $news->reset(); + $news->load(array($news_pk.' = ?', $news_id[0])); + $test->expect( + $news->author->name == 'Johnny English', + $type.': belongs-to-one: author relation created' + ); + + $news->author = NULL; + $news->save(); + $news->reset(); + $news->load(array($news_pk.' = ?', $news_id[0])); + $test->expect( + empty($news->author), + $type.': belongs-to-one: author relation released' + ); + + $news->author = $author->_id; + $news->save(); + $news->reset(); + $news->load(array($news_pk.' = ?', $news_id[0])); + $test->expect( + $news->author->name == 'Johnny English', + $type.': belongs-to-one: relation created by raw id' + ); + + // belongs-to-many tag relation + /////////////////////////////////// + + $tag1 = new \TagModel(); + $tag1->load(array($tag_pk.' = ?', $tag_id[0])); + $tag2 = new \TagModel(); + $tag2->load(array($tag_pk.' = ?', $tag_id[1])); + $news->tags = array($tag1,$tag2); + $news->save(); + $news->reset(); + $news->load(array($news_pk.' = ?', $news_id[0])); + $test->expect( + $news->tags[0]->title == 'Web Design' && $news->tags[1]->title == 'Responsive', + $type.': belongs-to-many: relations created with array of mapper objects' + ); + + $news->reset(); + $news->load(array($news_pk.' = ?', $news_id[1])); + $news->tags = array($tag_id[1],$tag_id[2]); + $news->save(); + $news->reset(); + $news->load(array($news_pk.' = ?', $news_id[1])); + $test->expect( + $news->tags[0]->title == 'Responsive' && $news->tags[1]->title == 'Usability', + $type.': belongs-to-many: relations created with array of IDs' + ); + + $news->tags = null; + $news->save(); + $news->reset(); + $news->load(array($news_pk.' = ?', $news_id[1])); + $test->expect( + empty($news->tags), + $type.': belongs-to-many: relations released' + ); + + $tag->reset(); + $news->load(array($news_pk.' = ?', $news_id[1])); + $news->tags = $tag->load(array($tag_pk.' != ?',$tag_id[0])); + $news->save(); + $news->reset(); + $news->load(array($news_pk.' = ?', $news_id[1])); + $test->expect( + $news->tags[0]->title == 'Responsive' && $news->tags[1]->title == 'Usability', + $type.': belongs-to-many: relations created with hydrated mapper' + ); + + + $news->reset(); + $tag->reset(); + $news->load(array($news_pk.' = ?', $news_id[2])); + $news->tags = $tag_id[0].';'.$tag_id[2]; + $news->save(); + $news->reset(); + $news->load(array($news_pk.' = ?', $news_id[2])); + $test->expect( + $news->tags[0]->title == 'Web Design' && $news->tags[1]->title == 'Usability', + $type.': belongs-to-many: relations created with split-able string' + ); + $test->expect( + is_object($news->tags) && $news->tags instanceof \DB\CortexCollection, + $type.': belongs-to-many: result is collection' + ); + + + // has-one relation + /////////////////////////////////// + $profile = new ProfileModel(); + $pc=$profile::resolveConfiguration(); + $profile_pk = (is_int(strpos($type,'sql'))?$pc['primary']:'_id'); + + $profile->message = 'Hello World'; + $profile->author = $author->load(array($author_pk.' = ?',$author_id[0])); + $profile->save(); + $profile_id = $profile->_id; + $profile->reset(); + $author->reset(); + $author->load(array($author_pk.' = ?', $author_id[0])); + $profile->load(array($profile_pk.' = ?', $profile_id)); + $test->expect( + $author->profile->message == 'Hello World' && + $profile->author->name == "Johnny English", + $type.': has-one: relation assigned' + ); + + $profile->reset(); + $profile->message = 'I\'m feeling lucky'; + $profile->image = 'lolcat.jpg'; + $author->reset(); + $author->load(array($author_pk.' = ?',$author_id[1])); + $author->profile = $profile; + $author->save(); + $profile->reset(); + $author->reset(); + $author->load(array($author_pk.' = ?', $author_id[1])); + $test->expect( + $author->profile->message == 'I\'m feeling lucky', + $type.': has-one: inverse relation' + ); + + + // has-many relation + /////////////////////////////////// + + $author->load(array($author_pk.' = ?', $author_id[0])); + $result = $this->getResult($author->news); + $test->expect( + $result[0]['title'] == "Responsive Images" && + $result[0]['tags'][0]['title'] == 'Web Design' && + $result[0]['tags'][1]['title'] == 'Responsive', + $type.': has-many inverse relation' + ); + + // many to many relation + /////////////////////////////////// + + $news->load(array($news_pk.' = ?',$news_id[0])); + $news->tags2 = array($tag_id[0],$tag_id[1]); + $news->save(); + $news->reset(); + $news->load(array($news_pk.' = ?',$news_id[0])); + $test->expect( + $news->tags2[0]['title'] == 'Web Design' && + $news->tags2[1]['title'] == 'Responsive', + $type.': many-to-many relation created' + ); + + $test->expect( + is_object($news->tags2) && $news->tags2 instanceof \DB\CortexCollection, + $type.': many-to-many: result is collection' + ); + + $news->load(array($news_pk.' = ?', $news_id[0])); + $news->tags2 = NULL; + $news->save(); + $news->reset(); + $news->load(array($news_pk.' = ?', $news_id[0])); + $test->expect( + is_null($news->tags2), + $type.': many-to-many relation released' + ); + + $all = $news->find(); + $test->expect( + $all[1]->tags2 === NULL + && $all[2]->author === NULL, + $type.': empty relations are NULL' + ); + + $arr = $news->cast(); + $test->expect( + is_array($arr['tags']), + $type.': collection becomes array in casted model' + ); + + if ($type == 'mongo') { + $test->expect( + is_string($arr['_id']), + $type.': id becomes string in casted model' + ); + } + + /////////////////////////////////// + return $test->results(); + } + +} \ No newline at end of file diff --git a/app/app/cortex/test_syntax.php b/app/app/cortex/test_syntax.php new file mode 100644 index 00000000..9efa7e28 --- /dev/null +++ b/app/app/cortex/test_syntax.php @@ -0,0 +1,364 @@ + array('type' => \DB\SQL\Schema::DT_TEXT), + 'num1' => array('type' => \DB\SQL\Schema::DT_INT4), + 'num2' => array('type' => \DB\SQL\Schema::DT_INT4), + ); + \DB\Cortex::setup($db, $tname, $fields); + + // adding some testing data + $cx = new \DB\Cortex($db, $tname); + $cx->title = 'bar1'; + $cx->save(); + $cx->reset(); + + $cx->title = 'baz2'; + $cx->num1 = 1; + $cx->save(); + $cx->reset(); + + $cx->title = 'foo3'; + $cx->num1 = 4; + $cx->save(); + $cx->reset(); + + $cx->title = 'foo4'; + $cx->num1 = 3; + $cx->save(); + $cx->reset(); + + $cx->title = 'foo5'; + $cx->num1 = 3; + $cx->num2 = 5; + $cx->save(); + $cx->reset(); + + $cx->title = 'foo6'; + $cx->num1 = 3; + $cx->num2 = 1; + $cx->save(); + $cx->reset(); + + $cx->title = 'foo7'; + $cx->num1 = 3; + $cx->num2 = 10; + $cx->save(); + $cx->reset(); + + $cx->title = 'foo8'; + $cx->num1 = 5; + $cx->save(); + $cx->reset(); + + $cx->title = 'foo9'; + $cx->num1 = 8; + $cx->save(); + $cx->reset(); + + $result = $this->getResult($cx->find()); + + $expected = array( + 0 => array( + 'title' => 'bar1', + ), + 1 => array( + 'num1' => 1, + 'title' => 'baz2', + ), + 2 => array( + 'num1' => 4, + 'title' => 'foo3', + ), + 3 => array( + 'num1' => 3, + 'title' => 'foo4', + ), + 4 => array( + 'num1' => 3, + 'num2' => 5, + 'title' => 'foo5', + ), + 5 => array( + 'num1' => 3, + 'num2' => 1, + 'title' => 'foo6', + ), + 6 => array( + 'num1' => 3, + 'num2' => 10, + 'title' => 'foo7', + ), + 7 => array( + 'num1' => 5, + 'title' => 'foo8', + ), + 8 => array( + 'num1' => 8, + 'title' => 'foo9', + ), + ); + + $test->expect( + json_encode($result) == json_encode($expected), + $type.': init mapper, adding records' + ); + + // operator = + $result = $this->getResult($cx->find(array('title = ?', 'foo7'))); + $expected = array( + 0 => array( + 'num1' => 3, + 'num2' => 10, + 'title' => 'foo7', + ), + ); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': operator check: =' + ); + + // operator > + $result = $this->getResult($cx->find(array('num1 > ?', 4))); + $expected = array( + 0 => array( + 'num1' => 5, + 'title' => 'foo8', + ), + 1 => array( + 'num1' => 8, + 'title' => 'foo9', + ), + ); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': operator check: >' + ); + + // operator >= + $result = $this->getResult($cx->find(array('num1 >= ?', 5))); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': operator check: >=' + ); + + // operator < + $result = $this->getResult($cx->find(array('num2 < ?', 2))); + $expected = array( + 0 => array( + 'num1' => 3, + 'num2' => 1, + 'title' => 'foo6', + ), + ); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': operator check: <' + ); + + // operator <= + $result = $this->getResult($cx->find(array('num2 <= ?', 1))); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': operator check: <=' + ); + + // operator without binding + $result = $this->getResult($cx->find(array('num1 > 4'))); + $expected = array( + 0 => array( + 'num1' => 5, + 'title' => 'foo8', + ), + 1 => array( + 'num1' => 8, + 'title' => 'foo9', + ), + ); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': operator without binding' + ); + + // field comparision + $result = $this->getResult($cx->find( + array('num2 > num1', 1))); + $expected = array( + 0 => array( + 'num1' => 3, + 'num2' => 5, + 'title' => 'foo5', + ), + 1 => array( + 'num1' => 3, + 'num2' => 10, + 'title' => 'foo7', + ), + ); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': check field comparision' + ); + + // lookahead search + $result = $this->getResult($cx->find(array('title like ?', '%o6'))); + $expected = array( + 0 => array( + 'num1' => 3, + 'num2' => 1, + 'title' => 'foo6', + ), + ); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': lookahead search' + ); + + // lookbehind search + $result = $this->getResult($cx->find(array('title like ?', 'bar%'))); + $expected = array( + 0 => array( + 'title' => 'bar1', + ), + ); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': lookbehind search' + ); + + // full search + $result = $this->getResult($cx->find(array('title like ?', '%a%'))); + $expected = array( + 0 => array( + 'title' => 'bar1', + ), + 1 => array( + 'num1' => 1, + 'title' => 'baz2', + ), + ); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': full search' + ); + + // negated search + $result = $this->getResult($cx->find(array('title not like ?', 'foo%'))); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': negated search' + ); + + // AND / OR chaining + $result = $this->getResult($cx->find( + array('(num2 < ? AND num1 > ?) OR title like ?', 2, 1, '%o9'))); + $expected = array( + 0 => array( + 'num1' => 3, + 'num2' => 1, + 'title' => 'foo6', + ), + 1 => array( + 'num1' => 8, + 'title' => 'foo9', + ), + ); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': check logical operator chaining' + ); + + // check limit + $result = $this->getResult($cx->find( + null, array('limit' => '2'))); + $expected = array( + 0 => array( + 'title' => 'bar1', + ), + 1 => array( + 'num1' => 1, + 'title' => 'baz2', + ), + ); + $test->expect( + json_encode($result) == json_encode($expected), + $type.': check limit' + ); + + // check order + $result = $this->getResult($cx->find( + array('num2 >= ?', 1), array('order' => 'num2 desc'))); + $expected = array( + 0 => array( + 'num1' => 3, + 'num2' => 10, + 'title' => 'foo7', + ), + 1 => array( + 'num1' => 3, + 'num2' => 5, + 'title' => 'foo5', + ), + 2 => array( + 'num1' => 3, + 'num2' => 1, + 'title' => 'foo6', + ), + ); + + $test->expect( + json_encode($result) == json_encode($expected), + $type.': check order' + ); + + // IN search + $rc = $cx->find(array('num1 IN ?',array(4,5,8))); + $result = $rc->getAll('title'); + sort($result); + $test->expect( + json_encode($result) == json_encode(array('foo3','foo8','foo9')), + $type.': IN operator' + ); + + $rc = $cx->find(array('num1 IN ? && num2 > ? && num2 NOT IN ?',array(3,4),1,array(10))); + $result = $rc->getAll('title'); + $test->expect( + json_encode($result) == json_encode(array('foo5')), + $type.': enhanced IN, NOT IN operator' + ); + + /////////////////////////////////// + return $test->results(); + } + + /** + * unify results for better comparison + */ + private function getResult($result) + { + $out = array(); + foreach ($result as $row) { + $row = $row->cast(); + unset($row['_id']); + unset($row['id']); + ksort($row); + foreach ($row as $col => $val) { + if (empty($val) || is_null($val)) + unset($row[$col]); + } + $out[] = $row; + } + return $out; + } +} \ No newline at end of file diff --git a/app/app/schema.php b/app/app/schema.php new file mode 100644 index 00000000..ea6bbfd7 --- /dev/null +++ b/app/app/schema.php @@ -0,0 +1,544 @@ +f3->get('timer') - $this->roundTime; + $this->roundTime = microtime(TRUE) - $this->f3->get('timer'); + return ' [ '.sprintf('%.3f', $time).'s ]'; + } + + private function getTestDesc($text) + { + return $this->getTime().' '.$this->current_engine.': #'.$this->current_test++.' - '.$text; + } + + function get() + { + $this->f3 = \Base::instance(); + $this->test = new \Test; + + $this->f3->set('QUIET', false); + $this->f3->set('CACHE', false); + + $dbs = array( + /*'mysql' => new \DB\SQL( + 'mysql:host=localhost;port=3306;dbname=fatfree', 'fatfree', '' + ),*/ + 'sqlite' => new \DB\SQL( + 'sqlite::memory:' + // 'sqlite:db/sqlite.db' + ), + /*'pgsql' => new \DB\SQL( + 'pgsql:host=localhost;dbname=fatfree', 'fatfree', 'fatfree' + ),*/ + /*'sqlsrv2012' => new \DB\SQL( + 'sqlsrv:SERVER=LOCALHOST\SQLEXPRESS2012;Database=fatfree','fatfree', 'fatfree' + ),*/ + /*'sqlsrv2008' => new \DB\SQL( + 'sqlsrv:SERVER=LOCALHOST\SQLEXPRESS2008;Database=fatfree','fatfree', 'fatfree' + )*/ + ); + + $this->roundTime = microtime(TRUE) - \Base::instance()->get('timer'); + $this->tname = 'test_table'; + + foreach ($dbs as $type => $db) { + $this->current_engine = $type; + $this->runTestSuite($db); + $this->current_test = 1; + } + $this->f3->set('results', $this->test->results()); + } + + private function runTestSuite($db) + { + $schema = new \DB\SQL\Schema($db); + + $schema->dropTable($this->tname); + + // create table + $table = $schema->createTable($this->tname); + $table = $table->build(); + $result = $schema->getTables(); + $this->test->expect( + in_array($this->tname, $result), + $this->getTestDesc('create default table') + ); + unset($result); + + $this->test->expect( + $table instanceof \DB\SQL\TableModifier, + $this->getTestDesc('$table->build() returns TableModifier') + ); + + // drop table + $table->drop(); + $this->test->expect( + in_array($this->tname, $schema->getTables()) == false, + $this->getTestDesc('drop table') + ); + unset($table); + + // create table with columns + $table = $schema->createTable($this->tname); + $table->addColumn('title')->type($schema::DT_VARCHAR128); + $table->addColumn('number')->type($schema::DT_INT4); + $table = $table->build(); + $r1 = $schema->getTables(); + $r2 = $table->getCols(); + $this->test->expect( + in_array($this->tname, $r1) && in_array('id', $r2) + && in_array('title', $r2) && in_array('number', $r2), + $this->getTestDesc('create new table with additional columns') + ); + unset($r1,$r2); + + // testing all datatypes + foreach (array_keys($schema->dataTypes) as $index => $field) { + // testing column type + $table->addColumn('column_'.$index)->type($field); + $table->build(); + $r1 = $table->getCols(); + $this->test->expect( + in_array('column_'.$index, $r1), + $this->getTestDesc('adding column ['.$field.'], nullable') + ); + } + unset($r1); + + // adding some testing data + $mapper = new \DB\SQL\Mapper($db, $this->tname); + $mapper->column_7 = 'hello world'; + $mapper->save(); + $mapper->reset(); + $result = $mapper->findone(array('column_7 = ?', 'hello world'))->cast(); + unset($mapper); + $this->test->expect( + $result['column_7'] == 'hello world', + $this->getTestDesc('mapping dummy data') + ); + + // default value text, not nullable + $table->addColumn('text_default_not_null') + ->type($schema::DT_VARCHAR128) + ->nullable(false)->defaults('foo bar'); + $table->build(); + $r1 = $table->getCols(true); + $this->test->expect( + in_array('text_default_not_null', array_keys($r1)) && + $r1['text_default_not_null']['default'] == 'foo bar' && + $r1['text_default_not_null']['nullable'] == false, + $this->getTestDesc('adding column [VARCHAR128], not nullable with default value') + ); + unset($r1); + + // some testing dummy data + $mapper = new \DB\SQL\Mapper($db, $this->tname); + $mapper->column_7 = 'tanduay'; + $mapper->save(); + $mapper->reset(); + $result = $mapper->findone(array('column_7 = ?','tanduay'))->cast(); + $this->test->expect( + $result['column_7'] == 'tanduay' && + $result['text_default_not_null'] == 'foo bar', + $this->getTestDesc('mapping dummy data') + ); + unset($mapper,$result); + + // default value numeric, not nullable + $table->addColumn('int_default_not_null') + ->type($schema::DT_INT4)->nullable(false)->defaults(123); + $table->build(); + $r1 = $table->getCols(true); + $this->test->expect( + in_array('int_default_not_null', array_keys($r1)) && + $r1['int_default_not_null']['default'] == 123 && + $r1['int_default_not_null']['nullable'] == false, + $this->getTestDesc('adding column [INT4], not nullable with default value') + ); + unset($r1); + + // adding testing data + $mapper = new \DB\SQL\Mapper($db, $this->tname); + $mapper->column_7 = 'test3'; + $mapper->save(); + $mapper->reset(); + $r1 = $mapper->findone(array('column_7 = ?','test3'))->cast(); + $this->test->expect( + $r1['column_7'] == 'test3' && + $r1['int_default_not_null'] == 123, + $this->getTestDesc('mapping dummy data') + ); + unset($mapper,$r1); + + + // default value text, nullable + $table->addColumn('text_default_nullable') + ->type($schema::DT_VARCHAR128) + ->defaults('foo bar'); + $table->build(); + $r1 = $table->getCols(true); + $this->test->expect( + in_array('text_default_nullable', array_keys($r1)) && + $r1['text_default_nullable']['default'] == 'foo bar', + $this->getTestDesc('adding column [VARCHAR128], nullable with default value') + ); + unset($r1); + + // adding some dummy data + $mapper = new \DB\SQL\Mapper($db, $this->tname); + $mapper->column_7 = 'test4'; + $mapper->save(); + $mapper->reset(); + $mapper->column_7 = 'test5'; + $mapper->text_default_nullable = null; + $mapper->save(); + $mapper->reset(); + $result = $mapper->find(array('column_7 = ? OR column_7 = ?','test4','test5')); + foreach ($result as &$r) + $r = $r->cast(); + + $this->test->expect( + array_key_exists(0, $result) && array_key_exists(1, $result) && + $result[0]['column_7'] == 'test4' && $result[0]['text_default_nullable'] == 'foo bar' && + $result[1]['column_7'] == 'test5' && $result[1]['text_default_nullable'] === null, + $this->getTestDesc('mapping dummy data') + ); + unset($mapper, $result); + + // default value numeric, nullable + $table->addColumn('int_default_nullable')->type($schema::DT_INT4)->defaults(123); + $table->build(); + $r1 = $table->getCols(true); + $this->test->expect( + in_array('int_default_nullable', array_keys($r1)) == true && + $r1['int_default_nullable']['default'] == 123, + $this->getTestDesc('adding column [INT4], nullable with default value') + ); + unset($r1); + + // adding dummy data + $mapper = new \DB\SQL\Mapper($db, $this->tname); + $mapper->column_7 = 'test6'; + $mapper->save(); + $mapper->reset(); + $mapper->column_7 = 'test7'; + $mapper->int_default_nullable = null; + $mapper->save(); + $mapper->reset(); + $result = $mapper->find(array('column_7 = ? OR column_7 = ?', 'test6', 'test7')); + foreach ($result as &$r) + $r = $r->cast(); + + $this->test->expect( + array_key_exists(0, $result) && array_key_exists(1, $result) && + $result[0]['column_7'] == 'test6' && $result[0]['int_default_nullable'] === 123 && + $result[1]['column_7'] == 'test7' && $result[1]['int_default_nullable'] === null, + $this->getTestDesc('mapping dummy data') + ); + unset($mapper, $result); + + // current timestamp + $table->addColumn('stamp') + ->type($schema::DT_TIMESTAMP) + ->nullable(false) + ->defaults($schema::DF_CURRENT_TIMESTAMP); + $table->build(); + $r1 = $table->getCols(true); + $this->test->expect( + in_array('stamp', array_keys($r1)) && + $r1['stamp']['default'] == $schema::DF_CURRENT_TIMESTAMP, + $this->getTestDesc( + 'adding column [TIMESTAMP], not nullable with current_timestamp default value') + ); + unset($r1); + + + // datetime nullable + $table->addColumn('datetime')->type_datetime()->nullable(true); + $table->build(); + $r1 = $table->getCols(true); + $this->test->expect( + in_array('datetime', array_keys($r1)) && + $r1['datetime']['nullable'] == true, + $this->getTestDesc( + 'adding column [DATETIME], nullable, no default') + ); + unset($r1); + + + // adding dummy data + $mapper = new \DB\SQL\Mapper($db, $this->tname); + $mapper->column_7 = 'test_datetime'; + $mapper->datetime = NULL; + $mapper->save(); + $mapper->reset(); + $result = $mapper->find(array('column_7 = ?', 'test_datetime')); + foreach ($result as &$r) + $r = $r->cast(); + + $this->test->expect( + array_key_exists(0, $result) && $result[0]['column_7'] == 'test_datetime' && + $result[0]['datetime'] === null, + $this->getTestDesc('mapping dummy data') + ); + unset($mapper, $result); + + + // rename column + $table->renameColumn('text_default_not_null', 'title123'); + $table->build(); + $r1 = $table->getCols(); + $this->test->expect( + in_array('title123', $r1) && !in_array('text_default_not_null', $r1), + $this->getTestDesc('renaming column') + ); + unset($r1); + + // adding dummy data + $mapper = new \DB\SQL\Mapper($db, $this->tname); + $mapper->title123 = 'test8'; + $mapper->save(); + $mapper->reset(); + $result = $mapper->findone(array('title123 = ?','test8')); + $this->test->expect( + !$result->dry(), + $this->getTestDesc('mapping dummy data') + ); + $table->renameColumn('title123', 'text_default_not_null'); + $table->build(); + unset($result,$mapper); + + // remove column + $table->dropColumn('column_1'); + $table->build(); + $r1 = $table->getCols(); + $this->test->expect( + !in_array('column_1', $r1), + $this->getTestDesc('removing column') + ); + unset($r1); + + // rename table + $schema->dropTable('test123'); + $table->rename('test123'); + $result = $schema->getTables(); + $this->test->expect( + in_array('test123', $result) && !in_array($this->tname, $result), + $this->getTestDesc('renaming table') + ); + $table->rename($this->tname); + unset($result); + + // check record count + $mapper = new \DB\SQL\Mapper($db, $this->tname); + $this->test->expect( + count($mapper->find()) == 9, + $this->getTestDesc('check record count') + ); + unset($mapper); + + // adding composite primary keys + $table->addColumn('version')->type($schema::DT_INT4)->nullable(false)->defaults(1); + $table->primary(array('id', 'version')); + $table->build(); + $r1 = $table->getCols(true); + $this->test->expect(!empty($r1) && isset($r1['version']) && + $r1['id']['pkey'] == true && $r1['version']['pkey'] == true, + $this->getTestDesc('adding composite primary-keys') + ); + unset($r1); + + // check record count + $mapper = new \DB\SQL\Mapper($db, $this->tname); + $this->test->expect( + count($mapper->find()) == 9, + $this->getTestDesc('check record count') + ); + unset($mapper); + + // drop table + $schema->dropTable($this->tname); + $this->test->expect( + !in_array($this->tname, $schema->getTables()), + $this->getTestDesc('drop table') + ); + + // adding composite primary keys + $table = $schema->createTable($this->tname); + $table->addColumn('version')->type($schema::DT_INT4) + ->defaults(1)->nullable(false); + $table->primary(array('id', 'version')); + $table = $table->build(); + $r1 = $table->getCols(true); + + $this->test->expect(!empty($r1) && + $r1['id']['pkey'] == true && $r1['version']['pkey'] == true, + $this->getTestDesc('creating new table with composite key') + ); + $this->test->expect(!empty($r1) && + $r1['version']['default'] == '1', + $this->getTestDesc('default value on composite primary key') + ); + unset($r1); + + // more fields to composite primary key table + $table->addColumn('title')->type($schema::DT_VARCHAR256); + $table->addColumn('title2')->type($schema::DT_TEXT); + $table->addColumn('title_notnull') + ->type($schema::DT_VARCHAR128)->nullable(false)->defaults("foo"); + $table->build(); + $r1 = $table->getCols(true); + $this->test->expect( + array_key_exists('title', $r1) && + array_key_exists('title_notnull', $r1) && + $r1['id']['pkey'] == true && $r1['version']['pkey'] == true, + $this->getTestDesc('adding more fields to composite pk table') + ); + unset($r1); + + // testing primary keys with inserted data + $mapper = new \DB\SQL\Mapper($db, $this->tname); + $mapper->title = 'test1'; + $mapper->save(); + $mapper->reset(); + + $mapper->id = 1; + $mapper->title = 'nullable'; + $mapper->version = 2; + $mapper->save(); + $mapper->reset(); + + $mapper->title = 'test3'; + $mapper->title2 = 'foobar'; + $mapper->title_notnull = 'bar'; + $mapper->save(); + + $result = array_map(array($mapper,'cast'),$mapper->find()); + + $cpk_expected = array( + 0=>array( + 'id' => 1, + 'version' => 1, + 'title' => 'test1', + 'title2' => NULL, + 'title_notnull' => 'foo', + ), + 1=>array( + 'id' => 1, + 'version' => 2, + 'title' => 'nullable', + 'title2' => NULL, + 'title_notnull' => 'foo', + ), + 2=>array( + 'id' => 2, + 'version' => 1, + 'title' => 'test3', + 'title2' => 'foobar', + 'title_notnull' => 'bar', + ), + ); + foreach ($result as &$r) + ksort($r); + foreach ($cpk_expected as &$r) + ksort($r); + $this->test->expect( + json_encode($result) == json_encode($cpk_expected), + $this->getTestDesc('adding items with composite primary-keys') + ); + + $schema->dropTable($this->tname); + + // indexes + $table = $schema->createTable($this->tname); + $table->addColumn('rawtest', array('type' => $schema::DT_VARCHAR256, 'default' => 'foo')); + $table->addColumn('text')->type($schema::DT_TEXT); + $table->addColumn('foo')->type($schema::DT_VARCHAR128)->index(); + $table = $table->build(); + $r1 = $table->getCols(true); + $this->test->expect( + isset($r1['rawtest']) && $r1['rawtest']['default'] = 'foo', + $this->getTestDesc('adding column with options array') + ); + $indexes = $table->listIndex(); + $this->test->expect( + isset($indexes[$table->name.'___foo']), + $this->getTestDesc('column index on table creation') + ); + $table->addColumn('bar')->type($schema::DT_VARCHAR128)->index(true); + $table->addColumn('baz')->type($schema::DT_VARCHAR128); + $table->addIndex(array('foo', 'baz')); + $table->build(); + $indexes = $table->listIndex(); + $this->test->expect( + isset($indexes[$table->name.'___bar']), + $this->getTestDesc('column index on table alteration') + ); + $this->test->expect( + isset($indexes[$table->name.'___bar']) && $indexes[$table->name.'___bar']['unique'] == true, + $this->getTestDesc('unique index') + ); + $this->test->expect( + isset($indexes[$table->name.'___foo__baz']), + $this->getTestDesc('index on combined columns') + ); + + if($this->current_engine == 'sqlite') { + $table->dropColumn('rawtest'); + $table->build(); + $indexes = $table->listIndex(); + $this->test->expect( + isset($indexes[$table->name.'___foo__baz']) && isset($indexes[$table->name.'___bar']) + && $indexes[$table->name.'___bar']['unique'], + $this->getTestDesc('preserve indexes after table rebuild') + ); + } + + $table->dropIndex($table->name.'___bar'); + $table->build(); + $indexes = $table->listIndex(); + $this->test->expect( + !array_key_exists($table->name.'___bar',$indexes), + $this->getTestDesc('drop index') + ); + + // update column + $table->updateColumn('bar',$schema::DT_TEXT); + $table->build(); + $r1 = $table->getCols(true); + $this->test->expect( + array_key_exists('bar', $r1) && $r1['bar']['type'] == 'text', + $this->getTestDesc('update column') + ); + + // create table with text not nullable column + $table2 = $schema->createTable($this->tname.'_notnulltext'); + $table2->addColumn('desc')->type($schema::DT_TEXT)->nullable(false); + $table2 = $table2->build(); + $r1 = $schema->getTables(); + $r2 = $table2->getCols(true); + $this->test->expect( + in_array($this->tname.'_notnulltext', $r1) && array_key_exists('desc', $r2) + && $r2['desc']['nullable']==false, + $this->getTestDesc('create new table with not nullable text column') + ); + $table2->drop(); + + + } + +} \ No newline at end of file diff --git a/app/config.cfg b/app/config.cfg index 1408dc90..6cab48f6 100644 --- a/app/config.cfg +++ b/app/config.cfg @@ -1,7 +1,12 @@ [globals] ; Verbosity level of the stack trace. Assign values between 0 to 3 for increasing verbosity levels -DEBUG = 2 +DEBUG = 0 + +; If TRUE, the framework, after having logged stack trace and errors, stops execution (die without any status) when a non-fatal error is detected. +HALT = FALSE + +ONERROR = "Controller\MapController->showError" ; Path to the index.php main/front controller. BASE = /exodus4d/pathfinder diff --git a/app/lib/db/cortex.php b/app/lib/db/cortex.php new file mode 100644 index 00000000..fbb8bda1 --- /dev/null +++ b/app/lib/db/cortex.php @@ -0,0 +1,2509 @@ + + * https://github.com/ikkez/F3-Sugar/ + * + * @package DB + * @version 1.3.0 + * @since 24.04.2012 + * @date 19.01.2015 + */ + +namespace DB; +use DB\SQL\Schema; + +class Cortex extends Cursor { + + protected + // config + $db, // DB object [ \DB\SQL, \DB\Jig, \DB\Mongo ] + $table, // selected table, string + $fluid, // fluid sql schema mode, boolean + $fieldConf, // field configuration, array + $ttl, // default mapper schema ttl + $rel_ttl, // default mapper rel ttl + $primary, // SQL table primary key + // behaviour + $smartLoading, // intelligent lazy eager loading, boolean + $standardiseID, // return standardized '_id' field for SQL when casting + // internals + $dbsType, // mapper engine type [jig, sql, mongo] + $fieldsCache, // relation field cache + $saveCsd, // mm rel save cascade + $collectionID, // collection set identifier + $relFilter, // filter for loading related models + $hasCond, // IDs of records the next find should have + $whitelist, // restrict to these fields + $relWhitelist, // restrict relations to these fields + $grp_stack, // stack of group conditions + $countFields, // relational counter buffer + $preBinds, // bind values to be prepended to $filter + $vFields, // virtual fields buffer + $_ttl; // rel_ttl overwrite + + /** @var Cursor */ + protected $mapper; + + /** @var CortexQueryParser */ + protected $queryParser; + + static + $init = false; // just init without mapper + + const + // special datatypes + DT_SERIALIZED = 'SERIALIZED', + DT_JSON = 'JSON', + + // error messages + E_ARRAY_DATATYPE = 'Unable to save an Array in field %s. Use DT_SERIALIZED or DT_JSON.', + E_CONNECTION = 'No valid DB Connection given.', + E_NO_TABLE = 'No table specified.', + E_UNKNOWN_DB_ENGINE = 'This unknown DB system is not supported: %s', + E_FIELD_SETUP = 'No field setup defined', + E_UNKNOWN_FIELD = 'Field %s does not exist in %s.', + E_INVALID_RELATION_OBJECT = 'You can only save hydrated mapper objects', + E_NULLABLE_COLLISION = 'Unable to set NULL to the NOT NULLABLE field: %s', + E_WRONG_RELATION_CLASS = 'Relations only works with Cortex objects', + E_MM_REL_VALUE = 'Invalid value for many field "%s". Expecting null, split-able string, hydrated mapper object, or array of mapper objects.', + E_MM_REL_CLASS = 'Mismatching m:m relation config from class `%s` to `%s`.', + E_MM_REL_FIELD = 'Mismatching m:m relation keys from `%s` to `%s`.', + E_REL_CONF_INC = 'Incomplete relation config for `%s`. Linked key is missing.', + E_MISSING_REL_CONF = 'Cannot create related model. Specify a model name or relConf array.', + E_HAS_COND = 'Cannot use a "has"-filter on a non-bidirectional relation field'; + + /** + * init the ORM, based on given DBS + * @param null|object $db + * @param string $table + * @param null|bool $fluid + * @param int $ttl + */ + public function __construct($db = NULL, $table = NULL, $fluid = NULL, $ttl = 0) + { + if (!is_null($fluid)) + $this->fluid = $fluid; + if (!is_object($this->db=(is_string($db=($db?:$this->db))?\Base::instance()->get($db):$db))) + trigger_error(self::E_CONNECTION); + if ($this->db instanceof Jig) + $this->dbsType = 'jig'; + elseif ($this->db instanceof SQL) + $this->dbsType = 'sql'; + elseif ($this->db instanceof Mongo) + $this->dbsType = 'mongo'; + if ($table) + $this->table = $table; + if (!$this->primary || $this->dbsType != 'sql') + $this->primary = 'id'; + if (!$this->table && !$this->fluid) + trigger_error(self::E_NO_TABLE); + $this->ttl = $ttl ?: 60; + if (!$this->rel_ttl) + $this->rel_ttl = 0; + $this->_ttl = $this->rel_ttl ?: 0; + if (static::$init == TRUE) return; + if ($this->fluid) + static::setup($this->db,$this->getTable(),array()); + $this->initMapper(); + } + + /** + * create mapper instance + */ + public function initMapper() + { + switch ($this->dbsType) { + case 'jig': + $this->mapper = new Jig\Mapper($this->db, $this->table); + break; + case 'sql': + $this->mapper = new SQL\Mapper($this->db, $this->table, $this->whitelist, + ($this->fluid)?0:$this->ttl); + break; + case 'mongo': + $this->mapper = new Mongo\Mapper($this->db, $this->table); + break; + default: + trigger_error(sprintf(self::E_UNKNOWN_DB_ENGINE,$this->dbsType)); + } + $this->queryParser = CortexQueryParser::instance(); + $this->reset(); + $this->clearFilter(); + $f3 = \Base::instance(); + $this->smartLoading = $f3->exists('CORTEX.smartLoading') ? + $f3->get('CORTEX.smartLoading') : TRUE; + $this->standardiseID = $f3->exists('CORTEX.standardiseID') ? + $f3->get('CORTEX.standardiseID') : TRUE; + if(!empty($this->fieldConf)) + foreach($this->fieldConf as &$conf) + $conf=static::resolveRelationConf($conf); + } + + /** + * get fields or set whitelist / blacklist of fields + * @param array $fields + * @param bool $exclude + * @return array + */ + public function fields(array $fields=array(), $exclude=false) + { + if ($fields) + // collect restricted fields for related mappers + foreach($fields as $i=>$val) + if(is_int(strpos($val,'.'))) { + list($key, $relField) = explode('.',$val,2); + $this->relWhitelist[$key][(int)$exclude][] = $relField; + unset($fields[$i]); + } + $schema = $this->whitelist ?: $this->mapper->fields(); + if (!$schema && !$this->dbsType != 'sql' && $this->dry()) { + $schema = $this->load()->mapper->fields(); + $this->reset(); + } + if (!$this->whitelist && $this->fieldConf) + $schema=array_unique(array_merge($schema,array_keys($this->fieldConf))); + if (!$fields || empty($fields)) + return $schema; + elseif ($exclude) { + $this->whitelist=array_diff($schema,$fields); + } else + $this->whitelist=$fields; + $id=$this->dbsType=='sql'?$this->primary:'_id'; + if(!in_array($id,$this->whitelist)) + $this->whitelist[]=$id; + $this->initMapper(); + return $this->whitelist; + } + + /** + * set model definition + * config example: + * array('title' => array( + * 'type' => \DB\SQL\Schema::DT_TEXT, + * 'default' => 'new record title', + * 'nullable' => true + * ) + * '...' => ... + * ) + * @param array $config + */ + function setFieldConfiguration(array $config) + { + $this->fieldConf = $config; + $this->reset(); + } + + /** + * returns model field conf array + * @return array|null + */ + public function getFieldConfiguration() + { + return $this->fieldConf; + } + + /** + * kick start to just fetch the config + * @return array + */ + static public function resolveConfiguration() + { + static::$init=true; + $self = new static(); + static::$init=false; + $conf = array ( + 'table'=>$self->getTable(), + 'fieldConf'=>$self->getFieldConfiguration(), + 'db'=>$self->db, + 'fluid'=>$self->fluid, + 'primary'=>$self->primary, + ); + unset($self); + return $conf; + } + + public function addToCollection($cID) { + $this->collectionID = $cID; + } + + /** + * returns model table name + * @return string + */ + public function getTable() + { + if (!$this->table && $this->fluid) + $this->table = strtolower(get_class($this)); + return $this->table; + } + + /** + * setup / update table schema + * @static + * @param $db + * @param $table + * @param $fields + * @return bool + */ + static public function setup($db=null, $table=null, $fields=null) + { + /** @var Cortex $self */ + $self = get_called_class(); + if (is_null($db) || is_null($table) || is_null($fields)) + $df = $self::resolveConfiguration(); + if (!is_object($db=(is_string($db=($db?:$df['db']))?\Base::instance()->get($db):$db))) + trigger_error(self::E_CONNECTION); + if (strlen($table=$table?:$df['table'])==0) + trigger_error(self::E_NO_TABLE); + if (is_null($fields)) + if (!empty($df['fieldConf'])) + $fields = $df['fieldConf']; + elseif(!$df['fluid']) { + trigger_error(self::E_FIELD_SETUP); + return false; + } else + $fields = array(); + if ($db instanceof SQL) { + $schema = new Schema($db); + // prepare field configuration + if (!empty($fields)) + foreach($fields as $key => &$field) { + // fetch relation field types + $field = static::resolveRelationConf($field); + // check m:m relation + if (array_key_exists('has-many', $field)) { + // m:m relation conf [class,to-key,from-key] + if (!is_array($relConf = $field['has-many'])) { + unset($fields[$key]); + continue; + } + $rel = $relConf[0]::resolveConfiguration(); + // check if foreign conf matches m:m + if (array_key_exists($relConf[1],$rel['fieldConf']) + && !is_null($rel['fieldConf'][$relConf[1]]) + && $relConf['hasRel'] == 'has-many') { + // compute mm table name + $mmTable = isset($relConf[2]) ? $relConf[2] : + static::getMMTableName( + $rel['table'], $relConf[1], $table, $key, + $rel['fieldConf'][$relConf[1]]['has-many']); + if (!in_array($mmTable,$schema->getTables())) { + $mmt = $schema->createTable($mmTable); + $mmt->addColumn($relConf[1])->type_int(); + $mmt->addColumn($key)->type_int(); + $index = array($relConf[1],$key); + sort($index); + $mmt->addIndex($index); + $mmt->build(); + } + } + } + // skip virtual fields with no type + if (!array_key_exists('type', $field)) { + unset($fields[$key]); + continue; + } + // transform array fields + if (in_array($field['type'], array(self::DT_JSON, self::DT_SERIALIZED))) + $field['type']=$schema::DT_TEXT; + // defaults values + if (!array_key_exists('nullable', $field)) $field['nullable'] = true; + } + if (!in_array($table, $schema->getTables())) { + // create table + $table = $schema->createTable($table); + foreach ($fields as $field_key => $field_conf) + $table->addColumn($field_key, $field_conf); + if(isset($df) && $df['primary'] != 'id') { + $table->addColumn($df['primary'])->type_int(); + $table->primary($df['primary']); + } + $table->build(); + } else { + // add missing fields + $table = $schema->alterTable($table); + $existingCols = $table->getCols(); + foreach ($fields as $field_key => $field_conf) + if (!in_array($field_key, $existingCols)) + $table->addColumn($field_key, $field_conf); + // remove unused fields + // foreach ($existingCols as $col) + // if (!in_array($col, array_keys($fields)) && $col!='id') + // $table->dropColumn($col); + $table->build(); + } + } + return true; + } + + /** + * erase all model data, handle with care + * @param null $db + * @param null $table + */ + static public function setdown($db=null, $table=null) + { + $self = get_called_class(); + if (is_null($db) || is_null($table)) + $df = $self::resolveConfiguration(); + if (!is_object($db=(is_string($db=($db?:$df['db']))?\Base::instance()->get($db):$db))) + trigger_error(self::E_CONNECTION); + if (strlen($table=strtolower($table?:$df['table']))==0) + trigger_error(self::E_NO_TABLE); + if (isset($df) && !empty($df['fieldConf'])) + $fields = $df['fieldConf']; + else + $fields = array(); + $deletable = array(); + $deletable[] = $table; + foreach ($fields as $key => $field) { + $field = static::resolveRelationConf($field); + if (array_key_exists('has-many',$field)) { + if (!is_array($relConf = $field['has-many'])) + continue; + $rel = $relConf[0]::resolveConfiguration(); + // check if foreign conf matches m:m + if (array_key_exists($relConf[1],$rel['fieldConf']) && !is_null($relConf[1]) + && key($rel['fieldConf'][$relConf[1]]) == 'has-many') { + // compute mm table name + $deletable[] = isset($relConf[2]) ? $relConf[2] : + static::getMMTableName( + $rel['table'], $relConf[1], $table, $key, + $rel['fieldConf'][$relConf[1]]['has-many']); + } + } + } + + if($db instanceof Jig) { + /** @var Jig $db */ + $dir = $db->dir(); + foreach ($deletable as $item) + if(file_exists($dir.$item)) + unlink($dir.$item); + } elseif($db instanceof SQL) { + /** @var SQL $db */ + $schema = new Schema($db); + $tables = $schema->getTables(); + foreach ($deletable as $item) + if(in_array($item, $tables)) + $schema->dropTable($item); + } elseif($db instanceof Mongo) { + /** @var Mongo $db */ + foreach ($deletable as $item) + $db->selectCollection($item)->drop(); + } + } + + /** + * computes the m:m table name + * @param string $ftable foreign table + * @param string $fkey foreign key + * @param string $ptable own table + * @param string $pkey own key + * @param null|array $fConf foreign conf [class,key] + * @return string + */ + static protected function getMMTableName($ftable, $fkey, $ptable, $pkey, $fConf=null) + { + if ($fConf) { + list($fclass, $pfkey) = $fConf; + $self = get_called_class(); + // check for a matching config + if (!is_int(strpos($fclass, $self))) + trigger_error(sprintf(self::E_MM_REL_CLASS, $fclass, $self)); + if ($pfkey != $pkey) + trigger_error(sprintf(self::E_MM_REL_FIELD, + $fclass.'.'.$pfkey, $self.'.'.$pkey)); + } + $mmTable = array($ftable.'__'.$fkey, $ptable.'__'.$pkey); + natcasesort($mmTable); + $return = strtolower(str_replace('\\', '_', implode('_mm_', $mmTable))); + return $return; + } + + /** + * resolve relation field types + * @param $field + * @return mixed + */ + protected static function resolveRelationConf($field) + { + if (array_key_exists('belongs-to-one', $field)) { + // find primary field definition + if (!is_array($relConf = $field['belongs-to-one'])) + $relConf = array($relConf, '_id'); + // set field type + if ($relConf[1] == '_id') + $field['type'] = Schema::DT_INT8; + else { + // find foreign field type + $fc = $relConf[0]::resolveConfiguration(); + $field['belongs-to-one']['relPK'] = $fc['primary']; + $field['type'] = $fc['fieldConf'][$relConf[1]]['type']; + } + $field['nullable'] = true; + $field['relType'] = 'belongs-to-one'; + } + elseif (array_key_exists('belongs-to-many', $field)){ + $field['type'] = self::DT_JSON; + $field['nullable'] = true; + $field['relType'] = 'belongs-to-many'; + } + elseif (array_key_exists('has-many', $field)){ + $field['relType'] = 'has-many'; + $relConf = $field['has-many']; + if(!is_array($relConf)) + return $field; + $rel = $relConf[0]::resolveConfiguration(); + if(array_key_exists('has-many',$rel['fieldConf'][$relConf[1]])) { + $field['has-many']['hasRel'] = 'has-many'; + $field['has-many']['relTable'] = $rel['table']; + $field['has-many']['relField'] = $relConf[1]; + $field['has-many']['relPK'] = $rel['primary']; + } else { + $field['has-many']['hasRel'] = 'belongs-to-one'; + $toConf=$rel['fieldConf'][$relConf[1]]['belongs-to-one']; + if (is_array($toConf)) + $field['has-many']['relField'] = $toConf[1]; + } + } elseif(array_key_exists('has-one', $field)) + $field['relType'] = 'has-one'; + return $field; + } + + /** + * Return an array of result arrays matching criteria + * @param null $filter + * @param array $options + * @param int $ttl + * @param int $rel_depths + * @return array + */ + public function afind($filter = NULL, array $options = NULL, $ttl = 0, $rel_depths = 1) + { + $result = $this->find($filter, $options, $ttl); + return $result ? $result->castAll($rel_depths): NULL; + } + + /** + * Return an array of objects matching criteria + * @param array|null $filter + * @param array|null $options + * @param int $ttl + * @return CortexCollection + */ + public function find($filter = NULL, array $options = NULL, $ttl = 0) + { + $sort=false; + if ($this->dbsType!='sql') { + if (!empty($this->countFields)) + // see if reordering is needed + foreach($this->countFields as $counter) { + if ($options && isset($options['order']) && + preg_match('/count_'.$counter.'\h+(asc|desc)/i',$options['order'],$match)) + $sort=true; + } + if ($sort) { + // backup slice settings + if (isset($options['limit'])) { + $limit = $options['limit']; + unset($options['limit']); + } + if (isset($options['offset'])) { + $offset = $options['offset']; + unset($options['offset']); + } + } + } + $this->_ttl=$ttl?:$this->rel_ttl; + $result = $this->filteredFind($filter,$options,$ttl); + if (empty($result)) + return false; + foreach($result as &$record) { + $record = $this->factory($record); + unset($record); + } + if (!empty($this->countFields)) + // add counter for NoSQL engines + foreach($this->countFields as $counter) + foreach($result as &$mapper) { + $cr=$mapper->get($counter); + $mapper->virtual('count_'.$counter,$cr?count($cr):null); + } + $cc = new \DB\CortexCollection(); + $cc->setModels($result); + if($sort) { + $cc->orderBy($options['order']); + $cc->slice(isset($offset)?$offset:0,isset($limit)?$limit:NULL); + } + $this->clearFilter(); + return $cc; + } + + /** + * wrapper for custom find queries + * @param array $filter + * @param array $options + * @param int $ttl + * @param bool $count + * @return array|false array of underlying cursor objects + */ + protected function filteredFind($filter = NULL, array $options = NULL, $ttl = 0, $count=false) + { + if ($this->grp_stack) { + if ($this->dbsType == 'mongo') { + $group = array( + 'keys' => $this->grp_stack['keys'], + 'reduce' => 'function (obj, prev) {'.$this->grp_stack['reduce'].'}', + 'initial' => $this->grp_stack['initial'], + 'finalize' => $this->grp_stack['finalize'], + ); + if ($options && isset($options['group'])) { + if(is_array($options['group'])) + $options['group'] = array_merge($options['group'],$group); + else { + $keys = explode(',',$options['group']); + $keys = array_combine($keys,array_fill(0,count($keys),1)); + $group['keys'] = array_merge($group['keys'],$keys); + $options['group'] = $group; + } + } else + $options = array('group'=>$group); + } + if($this->dbsType == 'sql') { + if ($options && isset($options['group'])) + $options['group'].= ','.$this->grp_stack; + else + $options['group'] = $this->grp_stack; + } + // Jig can't group yet, but pending enhancement https://github.com/bcosca/fatfree/pull/616 + } + if ($this->dbsType == 'sql' && !$count) { + $m_refl=new \ReflectionObject($this->mapper); + $m_ad_prop=$m_refl->getProperty('adhoc'); + $m_ad_prop->setAccessible(true); + $m_refl_adhoc=$m_ad_prop->getValue($this->mapper); + $m_ad_prop->setAccessible(false); + unset($m_ad_prop,$m_refl); + } + $hasJoin = array(); + if ($this->hasCond) { + foreach($this->hasCond as $key => $hasCond) { + $addToFilter = null; + list($has_filter,$has_options) = $hasCond; + $type = $this->fieldConf[$key]['relType']; + $fromConf = $this->fieldConf[$key][$type]; + switch($type) { + case 'has-one': + case 'has-many': + if (!is_array($fromConf)) + trigger_error(sprintf(self::E_REL_CONF_INC, $key)); + $id = $this->dbsType == 'sql' ? $this->primary : '_id'; + if ($type=='has-many' && isset($fromConf['relField']) + && $fromConf['hasRel'] == 'belongs-to-one') + $id=$fromConf['relField']; + // many-to-many + if ($type == 'has-many' && $fromConf['hasRel'] == 'has-many') { + if ($this->dbsType == 'sql' + && !isset($has_options['limit']) && !isset($has_options['offset'])) { + $hasJoin = array_merge($hasJoin, + $this->_hasJoinMM_sql($key,$hasCond,$filter,$options)); + $options['group'] = (isset($options['group'])?$options['group'].',':''). + $this->db->quotekey($this->table.'.'.$this->primary); + $groupFields = explode(',', preg_replace('/"/','',$options['group'])); + // all non-aggregated fields need to be present in the GROUP BY clause + if (isset($m_refl_adhoc) && preg_match('/sybase|dblib|odbc|sqlsrv/i',$this->db->driver())) + foreach (array_diff($this->mapper->fields(),array_keys($m_refl_adhoc)) as $field) + if (!in_array($this->table.'.'.$field,$groupFields)) + $options['group'] .= ', '.$this->db->quotekey($this->table.'.'.$field); + } + elseif ($result = $this->_hasRefsInMM($key,$has_filter,$has_options,$ttl)) + $addToFilter = array($id.' IN ?', $result); + } // *-to-one + elseif ($result = $this->_hasRefsIn($key,$has_filter,$has_options,$ttl)) + $addToFilter = array($id.' IN ?', $result); + break; + // one-to-* + case 'belongs-to-one': + if ($this->dbsType == 'sql' + && !isset($has_options['limit']) && !isset($has_options['offset'])) { + if (!is_array($fromConf)) + $fromConf = array($fromConf, '_id'); + $rel = $fromConf[0]::resolveConfiguration(); + if ($this->dbsType == 'sql' && $fromConf[1] == '_id') + $fromConf[1] = $rel['primary']; + $hasJoin[] = $this->_hasJoin_sql($key,$rel['table'],$hasCond,$filter,$options); + } elseif ($result = $this->_hasRefsIn($key,$has_filter,$has_options,$ttl)) + $addToFilter = array($key.' IN ?', $result); + break; + default: + trigger_error(self::E_HAS_COND); + } + if (isset($result) && !isset($addToFilter)) + return false; + elseif (isset($addToFilter)) { + if (!$filter) + $filter = array(''); + if (!empty($filter[0])) + $filter[0] .= ' and '; + $filter[0] .= '('.array_shift($addToFilter).')'; + $filter = array_merge($filter, $addToFilter); + } + } + $this->hasCond = null; + } + $filter = $this->queryParser->prepareFilter($filter,$this->dbsType,$this->fieldConf); + if ($this->dbsType=='sql') { + $qtable = $this->db->quotekey($this->table); + if (isset($options['order']) && $this->db->driver() == 'pgsql') + // PostgreSQLism: sort NULL values to the end of a table + $options['order'] = preg_replace('/\h+DESC/i',' DESC NULLS LAST',$options['order']); + if (!empty($hasJoin)) { + // assemble full sql query + $adhoc=''; + if ($count) + $sql = 'SELECT COUNT(*) AS '.$this->db->quotekey('rows').' FROM '.$qtable; + else { + if (!empty($this->preBinds)) { + $crit = array_shift($filter); + $filter = array_merge($this->preBinds,$filter); + array_unshift($filter,$crit); + } + if (!empty($m_refl_adhoc)) + foreach ($m_refl_adhoc as $key=>$val) + $adhoc.=', '.$val['expr'].' AS '.$key; + $sql = 'SELECT '.$qtable.'.*'.$adhoc.' FROM '.$qtable; + } + $sql .= ' '.implode(' ',$hasJoin).' WHERE '.$filter[0]; + if (!$count) { + if (isset($options['group'])) + $sql .= ' GROUP BY '.$this->_sql_quoteCondition($options['group'], $this->table); + if (isset($options['order'])) + $sql .= ' ORDER BY '.$options['order']; + if (preg_match('/mssql|sqlsrv|odbc/', $this->db->driver()) && + (isset($options['limit']) || isset($options['offset']))) { + $ofs=isset($options['offset'])?(int)$options['offset']:0; + $lmt=isset($options['limit'])?(int)$options['limit']:0; + if (strncmp($this->db->version(),'11',2)>=0) { + // SQL Server 2012 + if (!isset($options['order'])) + $sql.=' ORDER BY '.$this->db->quotekey($this->primary); + $sql.=' OFFSET '.$ofs.' ROWS'.($lmt?' FETCH NEXT '.$lmt.' ROWS ONLY':''); + } else { + // SQL Server 2008 + $order=(!isset($options['order'])) + ?($this->db->quotekey($this->table.'.'.$this->primary)):$options['order']; + $sql=str_replace('SELECT','SELECT '.($lmt>0?'TOP '.($ofs+$lmt):'').' ROW_NUMBER() '. + 'OVER (ORDER BY '.$order.') AS rnum,',$sql); + $sql='SELECT * FROM ('.$sql.') x WHERE rnum > '.($ofs); + } + } else { + if (isset($options['limit'])) + $sql.=' LIMIT '.(int)$options['limit']; + if (isset($options['offset'])) + $sql.=' OFFSET '.(int)$options['offset']; + } + } + unset($filter[0]); + $result = $this->db->exec($sql, $filter, $ttl); + if ($count) + return $result[0]['rows']; + foreach ($result as &$record) { + // factory new mappers + $mapper = clone($this->mapper); + $mapper->reset(); + $m_adhoc = empty($adhoc) ? array() : $m_refl_adhoc; + foreach ($record as $key=>$val) + if (isset($m_refl_adhoc[$key])) + $m_adhoc[$key]['value']=$val; + else + $mapper->set($key, $val); + if (!empty($adhoc)) { + $refl = new \ReflectionObject($mapper); + $prop = $refl->getProperty('adhoc'); + $prop->setAccessible(true); + $prop->setValue($mapper,$m_adhoc); + $prop->setAccessible(false); + } + $record = $mapper; + unset($record, $mapper); + } + return $result; + } elseif (!empty($this->preBinds) && !$count) { + // bind values to adhoc queries + if (!$filter) + // we (PDO) need any filter to bind values + $filter = array('1=1'); + $crit = array_shift($filter); + $filter = array_merge($this->preBinds,$filter); + array_unshift($filter,$crit); + } + } + return ($count) + ? $this->mapper->count($filter,$ttl) + : $this->mapper->find($filter,$this->queryParser->prepareOptions($options,$this->dbsType),$ttl); + } + + /** + * Retrieve first object that satisfies criteria + * @param null $filter + * @param array $options + * @param int $ttl + * @return Cortex + */ + public function load($filter = NULL, array $options = NULL, $ttl = 0) + { + $this->reset(); + $this->_ttl=$ttl?:$this->rel_ttl; + $res = $this->filteredFind($filter, $options, $ttl); + if ($res) { + $this->mapper->query = $res; + $this->first(); + } else + $this->mapper->reset(); + $this->emit('load'); + return $this; + } + + /** + * add has-conditional filter to next find call + * @param string $key + * @param array $filter + * @param null $options + * @return $this + */ + public function has($key, $filter, $options = null) { + if (!isset($this->fieldConf[$key])) + trigger_error(sprintf(self::E_UNKNOWN_FIELD,$key,get_called_class())); + if (!isset($this->fieldConf[$key]['relType'])) + trigger_error(self::E_HAS_COND); + if (is_string($filter)) + $filter=array($filter); + $this->hasCond[$key] = array($filter,$options); + return $this; + } + + /** + * return IDs of records that has a linkage to this mapper + * @param string $key relation field + * @param array $filter condition for foreign records + * @param array $options filter options for foreign records + * @param int $ttl + * @return array|false + */ + protected function _hasRefsIn($key, $filter, $options, $ttl = 0) + { + $type = $this->fieldConf[$key]['relType']; + $fieldConf = $this->fieldConf[$key][$type]; + if (!is_array($fieldConf)) + // one-to-many shortcut + $fieldConf = array($fieldConf, '_id'); + $rel = $this->getRelInstance($fieldConf[0],null,$key); + if($this->dbsType=='sql' && $fieldConf[1] == '_id') + $fieldConf[1] = $rel->primary; + $hasSet = $rel->find($filter, $options, $ttl); + if (!$hasSet) + return false; + $hasSetByRelId = array_unique($hasSet->getAll($fieldConf[1], true)); + return empty($hasSetByRelId) ? false : $hasSetByRelId; + } + + /** + * return IDs of own mappers that match the given relation filter on pivot tables + * @param string $key + * @param array $filter + * @param array $options + * @param int $ttl + * @return array|false + */ + protected function _hasRefsInMM($key, $filter, $options, $ttl=0) + { + $fieldConf = $this->fieldConf[$key]['has-many']; + $rel = $this->getRelInstance($fieldConf[0],null,$key); + $hasSet = $rel->find($filter,$options,$ttl); + $result = false; + if ($hasSet) { + $hasIDs = $hasSet->getAll('_id',true); + if (!array_key_exists('refTable', $fieldConf)) { + $mmTable = isset($fieldConf[2]) ? $fieldConf[2] : + static::getMMTableName($fieldConf['relTable'], + $fieldConf['relField'], $this->getTable(), $key); + $this->fieldConf[$key]['has-many']['refTable'] = $mmTable; + } else + $mmTable = $fieldConf['refTable']; + $pivot = $this->getRelInstance(null,array('db'=>$this->db,'table'=>$mmTable)); + $pivotSet = $pivot->find(array($key.' IN ?',$hasIDs),null,$ttl); + if ($pivotSet) + $result = array_unique($pivotSet->getAll($fieldConf['relField'],true)); + } + return $result; + } + + /** + * build query for SQL pivot table join and merge conditions + */ + protected function _hasJoinMM_sql($key, $hasCond, &$filter, &$options) + { + $fieldConf = $this->fieldConf[$key]['has-many']; + $hasJoin = array(); + if (!array_key_exists('refTable', $fieldConf)) { + // compute mm table name + $mmTable = isset($fieldConf[2]) ? $fieldConf[2] : + static::getMMTableName($fieldConf['relTable'], + $fieldConf['relField'], $this->getTable(), $key); + $this->fieldConf[$key]['has-many']['refTable'] = $mmTable; + } else + $mmTable = $fieldConf['refTable']; + $hasJoin[] = $this->_sql_left_join($this->primary,$this->table,$fieldConf['relField'],$mmTable); + $hasJoin[] = $this->_sql_left_join($key,$mmTable,$fieldConf['relPK'],$fieldConf['relTable']); + $this->_sql_mergeRelCondition($hasCond,$fieldConf['relTable'],$filter,$options); + return $hasJoin; + } + + /** + * build query for single SQL table join and merge conditions + */ + protected function _hasJoin_sql($key, $table, $cond, &$filter, &$options) + { + $relConf = $this->fieldConf[$key]['belongs-to-one']; + $relModel = is_array($relConf)?$relConf[0]:$relConf; + $rel = $this->getRelInstance($relModel,null,$key); + $fkey = is_array($this->fieldConf[$key]['belongs-to-one']) ? + $this->fieldConf[$key]['belongs-to-one'][1] : $rel->primary; + $query = $this->_sql_left_join($key,$this->table,$fkey,$table); + $this->_sql_mergeRelCondition($cond,$table,$filter,$options); + return $query; + } + + /** + * assemble SQL join query string + */ + protected function _sql_left_join($skey,$sTable,$fkey,$fTable) + { + $skey = $this->db->quotekey($skey); + $sTable = $this->db->quotekey($sTable); + $fkey = $this->db->quotekey($fkey); + $fTable = $this->db->quotekey($fTable); + return 'LEFT JOIN '.$fTable.' ON '.$sTable.'.'.$skey.' = '.$fTable.'.'.$fkey; + } + + /** + * merge condition of relation with current condition + * @param array $cond condition of related model + * @param string $table table of related model + * @param array $filter current filter to merge with + * @param array $options current options to merge with + */ + protected function _sql_mergeRelCondition($cond, $table, &$filter, &$options) + { + $table = $this->db->quotekey($table); + if (!empty($cond[0])) { + $whereClause = '('.array_shift($cond[0]).')'; + $whereClause = $this->_sql_quoteCondition($whereClause,$table); + if (!$filter) + $filter = array($whereClause); + elseif (!empty($filter[0])) + $filter[0] = '('.$this->_sql_quoteCondition($filter[0], + $this->db->quotekey($this->table)).') and '.$whereClause; + $filter = array_merge($filter, $cond[0]); + } + if ($cond[1] && isset($cond[1]['group'])) { + $hasGroup = preg_replace('/(\w+)/i', $table.'.$1', $cond[1]['group']); + $options['group'] .= ','.$hasGroup; + } + } + + protected function _sql_quoteCondition($cond, $table) + { + $db = $this->db; + if (preg_match('/[`\'"\[\]]/i',$cond)) + return $cond; + return preg_replace_callback('/\w+/i',function($match) use($table,$db) { + if (preg_match('/\b(AND|OR|IN|LIKE|NOT)\b/i',$match[0])) + return $match[0]; + return $table.'.'.$db->quotekey($match[0]); + }, $cond); + } + + /** + * add filter for loading related models + * @param string $key + * @param array $filter + * @param array $option + * @return $this + */ + public function filter($key,$filter=null,$option=null) + { + $this->relFilter[$key] = array($filter,$option); + return $this; + } + + /** + * removes one or all relation filter + * @param null|string $key + */ + public function clearFilter($key = null) + { + if (!$key) + $this->relFilter = array(); + elseif(isset($this->relFilter[$key])) + unset($this->relFilter[$key]); + } + + /** + * merge the relation filter to the query criteria if it exists + * @param string $key + * @param array $crit + * @return array + */ + protected function mergeWithRelFilter($key,$crit) + { + if (array_key_exists($key, $this->relFilter) && + !empty($this->relFilter[$key][0])) + { + $filter = $this->relFilter[$key][0]; + $crit[0] .= ' and '.array_shift($filter); + $crit = array_merge($crit, $filter); + } + return $crit; + } + + /** + * returns the option condition for a relation filter, if defined + * @param string $key + * @return array null + */ + protected function getRelFilterOption($key) + { + return (array_key_exists($key, $this->relFilter) && + !empty($this->relFilter[$key][1])) + ? $this->relFilter[$key][1] : null; + } + + /** + * Delete object/s and reset ORM + * @param $filter + * @return void + */ + public function erase($filter = null) + { + $filter = $this->queryParser->prepareFilter($filter, $this->dbsType); + if ((!$filter && $this->emit('beforeerase')!==false) || $filter) { + if ($this->fieldConf) { + foreach($this->fieldConf as $field => $conf) + if (isset($conf['has-many']) && + $conf['has-many']['hasRel']=='has-many') + $this->set($field,null); + $this->save(); + } + $this->mapper->erase($filter); + if (!$filter) + $this->emit('aftererase'); + } + } + + /** + * Save mapped record + * @return mixed + **/ + function save() + { + if ($new = $this->dry()) { + if ($this->emit('beforeinsert')===false) + return false; + $result=$this->insert(); + } else { + if ($this->emit('beforeupdate')===false) + return false; + $result=$this->update(); + } + // m:m save cascade + if (!empty($this->saveCsd)) { + $fields = $this->fieldConf; + foreach($this->saveCsd as $key => $val) { + if($fields[$key]['relType'] == 'has-many') { + $relConf = $fields[$key]['has-many']; + if (!isset($relConf['refTable'])) { + // compute mm table name + $mmTable = isset($relConf[2]) ? $relConf[2] : + static::getMMTableName($relConf['relTable'], + $relConf['relField'], $this->getTable(), $key); + $this->fieldConf[$key]['has-many']['refTable'] = $mmTable; + } else + $mmTable = $relConf['refTable']; + $rel = $this->getRelInstance(null, array('db'=>$this->db, 'table'=>$mmTable)); + $id = $this->get('_id',true); + // delete all refs + if (is_null($val)) + $rel->erase(array($relConf['relField'].' = ?', $id)); + // update refs + elseif (is_array($val)) { + $rel->erase(array($relConf['relField'].' = ?', $id)); + foreach($val as $v) { + $rel->set($key,$v); + $rel->set($relConf['relField'],$id); + $rel->save(); + $rel->reset(); + } + } + unset($rel); + } elseif($fields[$key]['relType'] == 'has-one') { + $val->save(); + } + } + } + $this->emit($new?'afterinsert':'afterupdate'); + return $result; + } + + /** + * Count records that match criteria + * @param null $filter + * @param int $ttl + * @return mixed + */ + public function count($filter = NULL, $ttl = 60) + { + $has=$this->hasCond; + $count=$this->filteredFind($filter,null,$ttl,true); + $this->hasCond=$has; + return $count; + } + + /** + * Count records that are currently loaded + * @return int + */ + public function loaded() { + return count($this->mapper->query); + } + + /** + * add a virtual field that counts occurring relations + * @param $key + */ + public function countRel($key) { + if (isset($this->fieldConf[$key])){ + // one-to-one, one-to-many + if ($this->fieldConf[$key]['relType'] == 'belongs-to-one') { + if ($this->dbsType == 'sql') { + $this->set('count_'.$key,'count('.$key.')'); + $this->grp_stack=(!$this->grp_stack)?$key:$this->grp_stack.','.$key; + } elseif ($this->dbsType == 'mongo') + $this->_mongo_addGroup(array( + 'keys'=>array($key=>1), + 'reduce' => 'prev.count_'.$key.'++;', + "initial" => array("count_".$key => 0) + )); + else + trigger_error('Cannot add direct relational counter.'); + } elseif($this->fieldConf[$key]['relType'] == 'has-many') { + $relConf=$this->fieldConf[$key]['has-many']; + if ($relConf['hasRel']=='has-many') { + // many-to-many + if ($this->dbsType == 'sql') { + if (!isset($relConf['refTable'])) { + // compute mm table name + $mmTable = isset($relConf[2]) ? $relConf[2] : + static::getMMTableName($relConf['relTable'], + $relConf['relField'], $this->getTable(), $key); + $this->fieldConf[$key]['has-many']['refTable'] = $mmTable; + } else + $mmTable = $relConf['refTable']; + $filter = array($this->db->quotekey($mmTable).'.'.$this->db->quotekey($relConf['relField']) + .' = '.$this->db->quotekey($this->getTable()).'.'.$this->db->quotekey($this->primary)); + $from=$mmTable; + if (array_key_exists($key, $this->relFilter) && + !empty($this->relFilter[$key][0])) { + $options=array(); + $from = $mmTable.' '.$this->_sql_left_join($key,$mmTable,$relConf['relPK'],$relConf['relTable']); + $relFilter = $this->relFilter[$key]; + $this->_sql_mergeRelCondition($relFilter,$relConf['relTable'],$filter,$options); + } + $filter = $this->queryParser->prepareFilter($filter,$this->dbsType,$this->fieldConf); + $crit = array_shift($filter); + if (count($filter)>0) + $this->preBinds+=$filter; + $this->set('count_'.$key,'(select count('.$relConf['relField'].') from '.$from.' where '. + $crit.' group by '.$mmTable.'.'.$relConf['relField'].')'); + } else { + // count rel + $this->countFields[]=$key; + } + } elseif($this->fieldConf[$key]['has-many']['hasRel']=='belongs-to-one') { + // many-to-one + if ($this->dbsType == 'sql') { + $fConf=$relConf[0]::resolveConfiguration(); + $fTable=$this->db->quotekey($fConf['table']); + $fKey=$this->db->quotekey($fConf['primary']); + $rKey=$this->db->quotekey($relConf[1]); + $pKey=$this->db->quotekey($this->primary); + $table=$this->db->quotekey($this->getTable()); + $crit = $fTable.'.'.$rKey.' = '.$table.'.'.$pKey; + $filter = $this->mergeWithRelFilter($key,array($crit)); + $filter = $this->queryParser->prepareFilter($filter,$this->dbsType,$this->fieldConf); + $crit = array_shift($filter); + if (count($filter)>0) + $this->preBinds+=$filter; + $this->set('count_'.$key,'(select count('.$fTable.'.'.$fKey.') from '.$fTable.' where '. + $crit.' group by '.$fTable.'.'.$rKey.')'); + } else { + // count rel + $this->countFields[]=$key; + } + } + } + } + } + + /** + * merge mongo group options array + * @param $opt + */ + protected function _mongo_addGroup($opt){ + if (!$this->grp_stack) + $this->grp_stack = array('keys'=>array(),'initial'=>array(),'reduce'=>'','finalize'=>''); + if (isset($opt['keys'])) + $this->grp_stack['keys']+=$opt['keys']; + if (isset($opt['reduce'])) + $this->grp_stack['reduce'].=$opt['reduce']; + if (isset($opt['initial'])) + $this->grp_stack['initial']+=$opt['initial']; + if (isset($opt['finalize'])) + $this->grp_stack['finalize'].=$opt['finalize']; + } + + /** + * Bind value to key + * @return mixed + * @param $key string + * @param $val mixed + */ + function set($key, $val) + { + $fields = $this->fieldConf; + unset($this->fieldsCache[$key]); + // pre-process if field config available + if (!empty($fields) && isset($fields[$key]) && is_array($fields[$key])) { + // handle relations + if (isset($fields[$key]['belongs-to-one'])) { + // one-to-many, one-to-one + if (is_null($val)) + $val = NULL; + elseif (is_object($val) && + !($this->dbsType=='mongo' && $val instanceof \MongoId)) { + // fetch fkey from mapper + if (!$val instanceof Cortex || $val->dry()) + trigger_error(self::E_INVALID_RELATION_OBJECT); + else { + $relConf = $fields[$key]['belongs-to-one']; + $rel_field = (is_array($relConf) ? $relConf[1] : '_id'); + $val = $val->get($rel_field,true); + } + } elseif ($this->dbsType == 'mongo' && !$val instanceof \MongoId) + $val = new \MongoId($val); + } elseif (isset($fields[$key]['has-one'])){ + $relConf = $fields[$key]['has-one']; + if (is_null($val)) { + $val = $this->get($key); + $val->set($relConf[1],NULL); + } else { + if (!$val instanceof Cortex) { + $rel = $this->getRelInstance($relConf[0],null,$key); + $rel->load(array('_id = ?', $val)); + $val = $rel; + } + $val->set($relConf[1], $this->_id); + } + $this->saveCsd[$key] = $val; + return $val; + } elseif (isset($fields[$key]['belongs-to-many'])) { + // many-to-many, unidirectional + $fields[$key]['type'] = self::DT_JSON; + $relConf = $fields[$key]['belongs-to-many']; + $rel_field = (is_array($relConf) ? $relConf[1] : '_id'); + $val = $this->getForeignKeysArray($val, $rel_field, $key); + } + elseif (isset($fields[$key]['has-many'])) { + // many-to-many, bidirectional + $relConf = $fields[$key]['has-many']; + if ($relConf['hasRel'] == 'has-many') { + // custom setter + $val = $this->emit('set_'.$key, $val); + $val = $this->getForeignKeysArray($val,'_id',$key); + $this->saveCsd[$key] = $val; // array of keys + return $val; + } elseif ($relConf['hasRel'] == 'belongs-to-one') { + // TODO: many-to-one, bidirectional, inverse way + trigger_error("not implemented"); + } + } + // convert array content + if (is_array($val) && $this->dbsType == 'sql') + if ($fields[$key]['type'] == self::DT_SERIALIZED) + $val = serialize($val); + elseif ($fields[$key]['type'] == self::DT_JSON) + $val = json_encode($val); + else + trigger_error(sprintf(self::E_ARRAY_DATATYPE, $key)); + // add nullable polyfill + if ($val === NULL && ($this->dbsType == 'jig' || $this->dbsType == 'mongo') + && array_key_exists('nullable', $fields[$key]) && $fields[$key]['nullable'] === false) + trigger_error(sprintf(self::E_NULLABLE_COLLISION,$key)); + // MongoId shorthand + if ($this->dbsType == 'mongo' && !$val instanceof \MongoId) { + if ($key == '_id') + $val = new \MongoId($val); + elseif (preg_match('/INT/i',$fields[$key]['type']) + && !isset($fields[$key]['relType'])) + $val = (int) $val; + } + if (preg_match('/BOOL/i',$fields[$key]['type'])) { + $val = !$val || $val==='false' ? false : (bool) $val; + if ($this->dbsType == 'sql') + $val = (int) $val; + } + } + // fluid SQL + if ($this->fluid && $this->dbsType == 'sql') { + $schema = new Schema($this->db); + $table = $schema->alterTable($this->table); + // add missing field + if(!in_array($key,$table->getCols())) { + // determine data type + if (is_int($val)) $type = $schema::DT_INT; + elseif (is_double($val)) $type = $schema::DT_DOUBLE; + elseif (is_float($val)) $type = $schema::DT_FLOAT; + elseif (is_bool($val)) $type = $schema::DT_BOOLEAN; + elseif (date('Y-m-d H:i:s', strtotime($val)) == $val) $type = $schema::DT_DATETIME; + elseif (date('Y-m-d', strtotime($val)) == $val) $type = $schema::DT_DATE; + elseif (\UTF::instance()->strlen($val)<=255) $type = $schema::DT_VARCHAR256; + else $type = $schema::DT_TEXT; + $table->addColumn($key)->type($type); + $table->build(); + // update mapper fields + $newField = $table->getCols(true); + $newField = $newField[$key]; + $refl = new \ReflectionObject($this->mapper); + $prop = $refl->getProperty('fields'); + $prop->setAccessible(true); + $fields = $prop->getValue($this->mapper); + $fields[$key] = $newField + array('value'=>NULL,'changed'=>NULL); + $prop->setValue($this->mapper,$fields); + } + } + // custom setter + $val = $this->emit('set_'.$key, $val); + return $this->mapper->set($key, $val); + } + + /** + * call custom field handlers + * @param $event + * @param $val + * @return mixed + */ + protected function emit($event, $val=null) + { + if (isset($this->trigger[$event])) { + if (preg_match('/^[sg]et_/',$event)) { + $val = (is_string($f=$this->trigger[$event]) + && preg_match('/^[sg]et_/',$f)) + ? call_user_func(array($this,$event),$val) + : \Base::instance()->call($f,array($this,$val)); + } else + $val = \Base::instance()->call($this->trigger[$event],array($this,$val)); + } elseif (preg_match('/^[sg]et_/',$event) && method_exists($this,$event)) { + $this->trigger[] = $event; + $val = call_user_func(array($this,$event),$val); + } + return $val; + } + + /** + * Define a custom field setter + * @param $key + * @param $func + */ + public function onset($key,$func) { + $this->trigger['set_'.$key] = $func; + } + + /** + * Define a custom field getter + * @param $key + * @param $func + */ + public function onget($key,$func) { + $this->trigger['get_'.$key] = $func; + } + + /** + * virtual mapper field setter + * @param string $key + * @param mixed|callback $val + * @return mixed|null + */ + public function virtual($key,$val) { + $this->vFields[$key]=$val; + } + + /** + * Retrieve contents of key + * @return mixed + * @param string $key + * @param bool $raw + */ + function &get($key,$raw = false) + { + // handle virtual fields + if (isset($this->vFields[$key])) { + $out = (is_callable($this->vFields[$key])) + ? call_user_func($this->vFields[$key], $this) : $this->vFields[$key]; + return $out; + } + $fields = $this->fieldConf; + $id = ($this->dbsType == 'sql') ? $this->primary : '_id'; + if ($key == '_id' && $this->dbsType == 'sql') + $key = $id; + if ($this->whitelist && !in_array($key,$this->whitelist)) { + $out = null; + return $out; + } + if ($raw) { + $out = $this->exists($key) ? $this->mapper->{$key} : NULL; + return $out; + } + if (!empty($fields) && isset($fields[$key]) && is_array($fields[$key]) + && !array_key_exists($key,$this->fieldsCache)) { + // load relations + if (isset($fields[$key]['belongs-to-one'])) { + // one-to-X, bidirectional, direct way + if (!$this->exists($key) || is_null($this->mapper->{$key})) + $this->fieldsCache[$key] = null; + else { + // get config for this field + $relConf = $fields[$key]['belongs-to-one']; + if (!is_array($relConf)) + $relConf = array($relConf, '_id'); + // fetch related model + $rel = $this->getRelInstance($relConf[0],null,$key); + if ($this->dbsType == 'sql' && $relConf[1] == '_id') + $relConf[1] = $rel->primary; + // am i part of a result collection? + if ($this->collectionID && $this->smartLoading) { + $cx = CortexCollection::instance($this->collectionID); + // does the collection has cached results for this key? + if (!$cx->hasRelSet($key)) { + // build the cache, find all values of current key + $relKeys = array_unique($cx->getAll($key,true)); + // find related models + $crit = array($relConf[1].' IN ?', $relKeys); + $relSet = $rel->find($this->mergeWithRelFilter($key, $crit), + $this->getRelFilterOption($key),$this->_ttl); + // cache relSet, sorted by ID + $cx->setRelSet($key, $relSet ? $relSet->getBy($relConf[1]) : NULL); + } + // get a subset of the preloaded set + $result = $cx->getSubset($key,(string) $this->get($key,true)); + $this->fieldsCache[$key] = $result ? $result[0] : NULL; + } else { + $crit = array($relConf[1].' = ?', $this->get($key, true)); + $crit = $this->mergeWithRelFilter($key, $crit); + $this->fieldsCache[$key] = $rel->findone($crit, + $this->getRelFilterOption($key),$this->_ttl); + } + } + } + elseif (($type = isset($fields[$key]['has-one'])) + || isset($fields[$key]['has-many'])) { + $type = $type ? 'has-one' : 'has-many'; + $fromConf = $fields[$key][$type]; + if (!is_array($fromConf)) + trigger_error(sprintf(self::E_REL_CONF_INC, $key)); + $rel = $this->getRelInstance($fromConf[0],null,$key); + $relFieldConf = $rel->getFieldConfiguration(); + $relType = key($relFieldConf[$fromConf[1]]); + // one-to-*, bidirectional, inverse way + if ($relType == 'belongs-to-one') { + $toConf = $relFieldConf[$fromConf[1]]['belongs-to-one']; + if(!is_array($toConf)) + $toConf = array($toConf, $id); + if ($toConf[1] != $id && (!$this->exists($toConf[1]) + || is_null($this->mapper->get($toConf[1])))) + $this->fieldsCache[$key] = null; + elseif($this->collectionID && $this->smartLoading) { + // part of a result set + $cx = CortexCollection::instance($this->collectionID); + if(!$cx->hasRelSet($key)) { + // emit eager loading + $relKeys = $cx->getAll($toConf[1],true); + $crit = array($fromConf[1].' IN ?', $relKeys); + $relSet = $rel->find($this->mergeWithRelFilter($key,$crit), + $this->getRelFilterOption($key),$this->_ttl); + $cx->setRelSet($key, $relSet ? $relSet->getBy($fromConf[1],true) : NULL); + } + $result = $cx->getSubset($key, array($this->get($toConf[1]))); + $this->fieldsCache[$key] = $result ? (($type == 'has-one') + ? $result[0][0] : $result[0]) : NULL; + } else { + $crit = array($fromConf[1].' = ?', $this->get($toConf[1],true)); + $crit = $this->mergeWithRelFilter($key, $crit); + $opt = $this->getRelFilterOption($key); + $this->fieldsCache[$key] = (($type == 'has-one') + ? $rel->findone($crit,$opt,$this->_ttl) + : $rel->find($crit,$opt,$this->_ttl)) ?: NULL; + } + } + // many-to-many, bidirectional + elseif ($relType == 'has-many') { + if (!array_key_exists('refTable', $fromConf)) { + // compute mm table name + $toConf = $relFieldConf[$fromConf[1]]['has-many']; + $mmTable = isset($fromConf[2]) ? $fromConf[2] : + static::getMMTableName($fromConf['relTable'], + $fromConf['relField'], $this->getTable(), $key, $toConf); + $this->fieldConf[$key]['has-many']['refTable'] = $mmTable; + } else + $mmTable = $fromConf['refTable']; + // create mm table mapper + $rel = $this->getRelInstance(null,array('db'=>$this->db,'table'=>$mmTable)); + if ($this->collectionID && $this->smartLoading) { + $cx = CortexCollection::instance($this->collectionID); + if (!$cx->hasRelSet($key)) { + // get IDs of all results + $relKeys = $cx->getAll($id,true); + // get all pivot IDs + $mmRes = $rel->find(array($fromConf['relField'].' IN ?', $relKeys),null,$this->_ttl); + if (!$mmRes) + $cx->setRelSet($key, NULL); + else { + $pivotRel = array(); + $pivotKeys = array(); + foreach($mmRes as $model) { + $val = $model->get($key,true); + $pivotRel[ (string) $model->get($fromConf['relField'])][] = $val; + $pivotKeys[] = $val; + } + // cache pivot keys + $cx->setRelSet($key.'_pivot', $pivotRel); + // preload all rels + $pivotKeys = array_unique($pivotKeys); + $fRel = $this->getRelInstance($fromConf[0],null,$key); + $crit = array(($fRel->primary!='id' ? $fRel->primary : '_id').' IN ?', $pivotKeys); + $relSet = $fRel->find($this->mergeWithRelFilter($key, $crit), + $this->getRelFilterOption($key),$this->_ttl); + $cx->setRelSet($key, $relSet ? $relSet->getBy($id) : NULL); + unset($fRel); + } + } + // fetch subset from preloaded rels using cached pivot keys + $fkeys = $cx->getSubset($key.'_pivot', array($this->get($id))); + $this->fieldsCache[$key] = $fkeys ? $cx->getSubset($key, $fkeys[0]) : NULL; + } // no collection + else { + // find foreign keys + $results = $rel->find( + array($fromConf['relField'].' = ?', $this->get($id,true)),null,$this->_ttl); + if(!$results) + $this->fieldsCache[$key] = NULL; + else { + $fkeys = $results->getAll($key,true); + // create foreign table mapper + unset($rel); + $rel = $this->getRelInstance($fromConf[0],null,$key); + // load foreign models + $filter = array(($rel->primary!='id' ? $rel->primary : '_id').' IN ?', $fkeys); + $filter = $this->mergeWithRelFilter($key, $filter); + $this->fieldsCache[$key] = $rel->find($filter, + $this->getRelFilterOption($key),$this->_ttl); + } + } + } + } + elseif (isset($fields[$key]['belongs-to-many'])) { + // many-to-many, unidirectional + $fields[$key]['type'] = self::DT_JSON; + $result = !$this->exists($key) ? null :$this->mapper->get($key); + if ($this->dbsType == 'sql') + $result = json_decode($result, true); + if (!is_array($result)) + $this->fieldsCache[$key] = $result; + else { + // create foreign table mapper + $relConf = $fields[$key]['belongs-to-many']; + if (!is_array($relConf)) + $relConf = array($relConf, '_id'); + $rel = $this->getRelInstance($relConf[0],null,$key); + if ($this->dbsType == 'sql' && $relConf[1] == '_id') + $relConf[1] = $rel->primary; + $fkeys = array(); + foreach ($result as $el) + $fkeys[] = is_int($el)||ctype_digit($el)?(int)$el:(string)$el; + // if part of a result set + if ($this->collectionID && $this->smartLoading) { + $cx = CortexCollection::instance($this->collectionID); + if (!$cx->hasRelSet($key)) { + // find all keys + $relKeys = ($cx->getAll($key,true)); + if ($this->dbsType == 'sql'){ + foreach ($relKeys as &$val) { + $val = substr($val, 1, -1); + unset($val); + } + $relKeys = json_decode('['.implode(',',$relKeys).']'); + } else + $relKeys = call_user_func_array('array_merge', $relKeys); + // get related models + $crit = array($relConf[1].' IN ?', array_unique($relKeys)); + $relSet = $rel->find($this->mergeWithRelFilter($key, $crit), + $this->getRelFilterOption($key),$this->_ttl); + // cache relSet, sorted by ID + $cx->setRelSet($key, $relSet ? $relSet->getBy($relConf[1]) : NULL); + } + // get a subset of the preloaded set + $this->fieldsCache[$key] = $cx->getSubset($key, $fkeys); + } else { + // load foreign models + $filter = array($relConf[1].' IN ?', $fkeys); + $filter = $this->mergeWithRelFilter($key, $filter); + $this->fieldsCache[$key] = $rel->find($filter, + $this->getRelFilterOption($key),$this->_ttl); + } + } + } + // resolve array fields + elseif (isset($fields[$key]['type'])) { + if ($this->dbsType == 'sql') { + if ($fields[$key]['type'] == self::DT_SERIALIZED) + $this->fieldsCache[$key] = unserialize($this->mapper->{$key}); + elseif ($fields[$key]['type'] == self::DT_JSON) + $this->fieldsCache[$key] = json_decode($this->mapper->{$key},true); + } + if ($this->exists($key) && preg_match('/BOOL/i',$fields[$key]['type'])) { + $this->fieldsCache[$key] = (bool) $this->mapper->{$key}; + } + } + } + // fetch cached value, if existing + $val = array_key_exists($key,$this->fieldsCache) ? $this->fieldsCache[$key] + : (($this->exists($key)) ? $this->mapper->{$key} : null); + if ($this->dbsType == 'mongo' && $val instanceof \MongoId) { + // conversion to string makes further processing in template, etc. much easier + $val = (string) $val; + } + // custom getter + $out = $this->emit('get_'.$key, $val); + return $out; + } + + /** + * find the ID values of given relation collection + * @param $val string|array|object|bool + * @param $rel_field string + * @param $key string + * @return array|Cortex|null|object + */ + protected function getForeignKeysArray($val, $rel_field, $key) + { + if (is_null($val)) + return NULL; + if (is_object($val) && $val instanceof CortexCollection) + $val = $val->expose(); + elseif (is_string($val)) + // split-able string of collection IDs + $val = \Base::instance()->split($val); + elseif (!is_array($val) && !(is_object($val) + && ($val instanceof Cortex && !$val->dry()))) + trigger_error(sprintf(self::E_MM_REL_VALUE, $key)); + // hydrated mapper as collection + if (is_object($val)) { + $nval = array(); + while (!$val->dry()) { + $nval[] = $val->get($rel_field,true); + $val->next(); + } + $val = $nval; + } + elseif (is_array($val)) { + // array of single hydrated mappers, raw ID value or mixed + $isMongo = ($this->dbsType == 'mongo'); + foreach ($val as &$item) { + if (is_object($item) && + !($isMongo && $item instanceof \MongoId)) { + if (!$item instanceof Cortex || $item->dry()) + trigger_error(self::E_INVALID_RELATION_OBJECT); + else $item = $item->get($rel_field,true); + } + if ($isMongo && $rel_field == '_id' && is_string($item)) + $item = new \MongoId($item); + if (is_numeric($item)) + $item = (int) $item; + unset($item); + } + } + return $val; + } + + /** + * creates and caches related mapper objects + * @param string $model + * @param array $relConf + * @param string $key + * @return Cortex + */ + protected function getRelInstance($model=null,$relConf=null,$key='') + { + if (!$model && !$relConf) + trigger_error(self::E_MISSING_REL_CONF); + $relConf = $model ? $model::resolveConfiguration() : $relConf; + $relName = ($model?:'Cortex').'\\'.$relConf['db']->uuid().'\\'.$relConf['table']; + if (\Registry::exists($relName)) { + $rel = \Registry::get($relName); + $rel->reset(); + } else { + $rel = $model ? new $model : new Cortex($relConf['db'], $relConf['table']); + if (!$rel instanceof Cortex) + trigger_error(self::E_WRONG_RELATION_CLASS); + \Registry::set($relName, $rel); + } + // restrict fields of related mapper + if(!empty($key) && isset($this->relWhitelist[$key])) { + if (isset($this->relWhitelist[$key][0])) + $rel->fields($this->relWhitelist[$key][0],false); + if (isset($this->relWhitelist[$key][1])) + $rel->fields($this->relWhitelist[$key][1],true); + } + return $rel; + } + + /** + * Return fields of mapper object as an associative array + * @return array + * @param bool|Cortex $obj + * @param bool|int $rel_depths depths to resolve relations + */ + public function cast($obj = NULL, $rel_depths = 1) + { + $fields = $this->mapper->cast( ($obj) ? $obj->mapper : null ); + if (!empty($this->vFields)) + foreach(array_keys($this->vFields) as $key) + $fields[$key]=$this->get($key); + if (is_int($rel_depths)) + $rel_depths--; + if (!empty($this->fieldConf)) { + $fields += array_fill_keys(array_keys($this->fieldConf),NULL); + if($this->whitelist) + $fields = array_intersect_key($fields, array_flip($this->whitelist)); + $mp = $obj ? : $this; + foreach ($fields as $key => &$val) { + // post process configured fields + if (isset($this->fieldConf[$key]) && is_array($this->fieldConf[$key])) { + // handle relations + if (($rel_depths === TRUE || (is_int($rel_depths) && $rel_depths >= 0)) + && $type=preg_grep('/[belongs|has]-(to-)*[one|many]/', + array_keys($this->fieldConf[$key]))) { + $relType=$type[0]; + // cast relations + $val = (($relType == 'belongs-to-one' || $relType == 'belongs-to-many') + && !$mp->exists($key)) ? NULL : $mp->get($key); + if (is_array($val) || is_object($val)) { + if ($relType == 'belongs-to-one' || $relType == 'has-one') + // single object + $val = $val->cast(null, $rel_depths); + elseif ($relType == 'belongs-to-many' || $relType == 'has-many') + // multiple objects + foreach ($val as $k => $item) + $val[$k] = is_object($item) ? $item->cast(null, $rel_depths) : null; + } + if ($val instanceof CortexCollection) + $val = $val->expose(); + } + // decode array fields + elseif (isset($this->fieldConf[$key]['type'])) { + if ($this->dbsType == 'sql') { + if ($this->fieldConf[$key]['type'] == self::DT_SERIALIZED) + $val=unserialize($this->mapper->{$key}); + elseif ($this->fieldConf[$key]['type'] == self::DT_JSON) + $val=json_decode($this->mapper->{$key}, true); + } + if ($this->exists($key) + && preg_match('/BOOL/i',$this->fieldConf[$key]['type'])) { + $val = (bool) $this->mapper->{$key}; + } + } + } + if ($this->dbsType == 'mongo' && $key == '_id') + $val = (string) $val; + if ($this->dbsType == 'sql' && $key == 'id' && $this->standardiseID) { + $fields['_id'] = $val; + unset($fields[$key]); + } + unset($val); + } + } + // custom getter + foreach ($fields as $key => &$val) { + $val = $this->emit('get_'.$key, $val); + unset($val); + } + return $fields; + } + + /** + * cast a related collection of mappers + * @param string|array $key array of mapper objects, or field name + * @param int $rel_depths depths to resolve relations + * @return array array of associative arrays + */ + function castField($key, $rel_depths=0) + { + if (!$key) + return NULL; + $mapper_arr = $this->get($key); + if(!$mapper_arr) + return NULL; + $out = array(); + foreach ($mapper_arr as $mp) + $out[] = $mp->cast(null,$rel_depths); + return $out; + } + + /** + * wrap result mapper + * @param Cursor|array $mapper + * @return Cortex + */ + protected function factory($mapper) + { + if (is_array($mapper)) { + $mp = clone($this->mapper); + $mp->reset(); + $cx = $this->factory($mp); + $cx->copyfrom($mapper); + } else { + $cx = clone($this); + $cx->reset(false); + $cx->mapper = $mapper; + } + $cx->emit('load'); + return $cx; + } + + public function dry() { + return $this->mapper->dry(); + } + + /** + * hydrate the mapper from hive key or given array + * @param string|array $key + * @param callback|array|string $fields + * @return NULL + */ + public function copyfrom($key, $fields = null) + { + $f3 = \Base::instance(); + $srcfields = is_array($key) ? $key : $f3->get($key); + if ($fields) + if (is_callable($fields)) + $srcfields = $fields($srcfields); + else { + if (is_string($fields)) + $fields = $f3->split($fields); + $srcfields = array_intersect_key($srcfields, array_flip($fields)); + } + foreach ($srcfields as $key => $val) { + if (isset($this->fieldConf[$key]) && isset($this->fieldConf[$key]['type'])) { + if ($this->fieldConf[$key]['type'] == self::DT_JSON && is_string($val)) + $val = json_decode($val); + elseif ($this->fieldConf[$key]['type'] == self::DT_SERIALIZED && is_string($val)) + $val = unserialize($val); + } + $this->set($key, $val); + } + } + + /** + * copy mapper values into hive key + * @param string $key the hive key to copy into + * @param int $relDepth the depth of relations to resolve + * @return NULL|void + */ + public function copyto($key, $relDepth=0) { + \Base::instance()->set($key, $this->cast(null,$relDepth)); + } + + public function skip($ofs = 1) + { + $this->reset(false); + if ($this->mapper->skip($ofs)) + return $this; + else + $this->reset(false); + } + + public function first() + { + $this->reset(false); + $this->mapper->first(); + return $this; + } + + public function last() + { + $this->reset(false); + $this->mapper->last(); + return $this; + } + + /** + * reset and re-initialize the mapper + * @param bool $mapper + * @return NULL|void + */ + public function reset($mapper = true) + { + if ($mapper) + $this->mapper->reset(); + $this->fieldsCache=array(); + $this->saveCsd=array(); + $this->countFields=array(); + $this->preBinds=array(); + $this->grp_stack=null; + // set default values + if (($this->dbsType == 'jig' || $this->dbsType == 'mongo') + && !empty($this->fieldConf)) + foreach($this->fieldConf as $field_key => $field_conf) + if (array_key_exists('default',$field_conf)) { + $val = ($field_conf['default'] === \DB\SQL\Schema::DF_CURRENT_TIMESTAMP) + ? date('Y-m-d H:i:s') : $field_conf['default']; + $this->set($field_key, $val); + } + } + + /** + * check if a certain field exists in the mapper or + * or is a virtual relation field + * @param string $key + * @param bool $relField + * @return bool + */ + function exists($key, $relField = false) { + if (!$this->dry() && $key == '_id') return true; + return $this->mapper->exists($key) || + ($relField && isset($this->fieldConf[$key]['relType'])); + } + + /** + * clear any mapper field or relation + * @param string $key + * @return NULL|void + */ + function clear($key) { + unset($this->fieldsCache[$key]); + if (isset($this->fieldConf[$key]['relType'])) + $this->set($key,null); + $this->mapper->clear($key); + } + + function insert() { + $res = $this->mapper->insert(); + if (is_array($res)) + $res = $this->mapper; + if (is_object($res)) + $res = $this->factory($res); + return is_int($res) ? $this : $res; + } + + function update() { + $res = $this->mapper->update(); + if (is_array($res)) + $res = $this->mapper; + if (is_object($res)) + $res = $this->factory($res); + return is_int($res) ? $this : $res; + } + + function dbtype() { + return $this->mapper->dbtype(); + } + + public function __destruct() { + unset($this->mapper); + } + + public function __clone() { + $this->mapper = clone($this->mapper); + } + + function getiterator() { +// return new \ArrayIterator($this->cast(null,false)); + return new \ArrayIterator(array()); + } +} + + +class CortexQueryParser extends \Prefab { + + const + E_BRACKETS = 'Invalid query: unbalanced brackets found', + E_INBINDVALUE = 'Bind value for IN operator must be a populated array', + E_ENGINEERROR = 'Engine not supported', + E_MISSINGBINDKEY = 'Named bind parameter `%s` does not exist in filter arguments'; + + protected + $queryCache = array(); + + /** + * converts the given filter array to fit the used DBS + * + * example filter: + * array('text = ? AND num = ?','bar',5) + * array('num > ? AND num2 <= ?',5,10) + * array('num1 > num2') + * array('text like ?','%foo%') + * array('(text like ? OR text like ?) AND num != ?','foo%','%bar',23) + * + * @param array $cond + * @param string $engine + * @param null $fieldConf + * @return array|bool|null + */ + public function prepareFilter($cond, $engine,$fieldConf=null) + { + if (is_null($cond)) return $cond; + if (is_string($cond)) + $cond = array($cond); + $f3 = \Base::instance(); + $cacheHash = $f3->hash($f3->stringify($cond)).'.'.$engine; + if (isset($this->queryCache[$cacheHash])) + // load from memory + return $this->queryCache[$cacheHash]; + elseif ($f3->exists('CORTEX.queryParserCache') + && ($ttl = (int) $f3->get('CORTEX.queryParserCache'))) { + $cache = \Cache::instance(); + // load from cache + if ($f3->get('CACHE') && $ttl && ($cached = $cache->exists($cacheHash, $ncond)) + && $cached[0] + $ttl > microtime(TRUE)) { + $this->queryCache[$cacheHash] = $ncond; + return $ncond; + } + } + $where = array_shift($cond); + $args = $cond; + $where = str_replace(array('&&', '||'), array('AND', 'OR'), $where); + // prepare IN condition + $where = preg_replace('/\bIN\b\s*\(\s*(\?|:\w+)?\s*\)/i', 'IN $1', $where); + switch ($engine) { + case 'jig': + $ncond = $this->_jig_parse_filter($where, $args); + break; + case 'mongo': + $parts = $this->splitLogical($where); + if (is_int(strpos($where, ':'))) + list($parts, $args) = $this->convertNamedParams($parts, $args); + foreach ($parts as &$part) { + $part = $this->_mongo_parse_relational_op($part, $args, $fieldConf); + unset($part); + } + $ncond = $this->_mongo_parse_logical_op($parts); + break; + case 'sql': + // preserve identifier + $where = preg_replace('/(?!\B)_id/', 'id', $where); + $parts = $this->splitLogical($where); + // ensure positional bind params + if (is_int(strpos($where, ':'))) + list($parts, $args) = $this->convertNamedParams($parts, $args); + $ncond = array(); + foreach ($parts as &$part) { + // enhanced IN handling + if (is_int(strpos($part, '?'))) { + $val = array_shift($args); + if (is_int($pos = strpos($part, 'IN ?'))) { + if (!is_array($val) || empty($val)) + trigger_error(self::E_INBINDVALUE); + $bindMarks = str_repeat('?,', count($val) - 1).'?'; + $part = substr($part, 0, $pos).'IN ('.$bindMarks.')'; + $ncond = array_merge($ncond, $val); + } else + $ncond[] = $val; + } + } + array_unshift($ncond, implode(' ', $parts)); + break; + default: + trigger_error(self::E_ENGINEERROR); + } + $this->queryCache[$cacheHash] = $ncond; + if(isset($ttl) && $f3->get('CACHE')) { + // save to cache + $cache = \Cache::instance(); + $cache->set($cacheHash,$ncond,$ttl); + } + return $ncond; + } + + /** + * split where criteria string into logical chunks + * @param $cond + * @return array + */ + protected function splitLogical($cond) + { + return preg_split('/\s*((?splitLogical($where); + if (is_int(strpos($where, ':'))) + list($parts, $args) = $this->convertNamedParams($parts, $args); + $ncond = array(); + foreach ($parts as &$part) { + if (in_array(strtoupper($part), array('AND', 'OR'))) + continue; + // prefix field names + $part = preg_replace('/([a-z_-]+)/i', '@$1', $part, -1, $count); + // value comparison + if (is_int(strpos($part, '?'))) { + $val = array_shift($args); + preg_match('/(@\w+)/i', $part, $match); + // find like operator + if (is_int(strpos($upart = strtoupper($part), ' @LIKE '))) { + if ($not = is_int($npos = strpos($upart, '@NOT'))) + $pos = $npos; + $val = $this->_likeValueToRegEx($val); + $part = ($not ? '!' : '').'preg_match(?,'.$match[0].')'; + } // find IN operator + else if (is_int($pos = strpos($upart, ' @IN '))) { + if ($not = is_int($npos = strpos($upart, '@NOT'))) + $pos = $npos; + $part = ($not ? '!' : '').'in_array('.substr($part, 0, $pos). + ',array(\''.implode('\',\'', $val).'\'))'; + unset($val); + } + // add existence check + $part = '(isset('.$match[0].') && '.$part.')'; + if (isset($val)) + $ncond[] = $val; + } elseif ($count >= 1) { + // field comparison + preg_match_all('/(@\w+)/i', $part, $matches); + $chks = array(); + foreach ($matches[0] as $field) + $chks[] = 'isset('.$field.')'; + $part = '('.implode(' && ',$chks).' && ('.$part.'))'; + } + } + array_unshift($ncond, implode(' ', $parts)); + return $ncond; + } + + /** + * find and wrap logical operators AND, OR, (, ) + * @param $parts + * @return array + */ + protected function _mongo_parse_logical_op($parts) + { + $b_offset = 0; + $ncond = array(); + $child = array(); + for ($i = 0, $max = count($parts); $i < $max; $i++) { + $part = $parts[$i]; + if ($part == '(') { + // add sub-bracket to parse array + if ($b_offset > 0) + $child[] = $part; + $b_offset++; + } elseif ($part == ')') { + $b_offset--; + // found closing bracket + if ($b_offset == 0) { + $ncond[] = ($this->_mongo_parse_logical_op($child)); + $child = array(); + } elseif ($b_offset < 0) + trigger_error(self::E_BRACKETS); + else + // add sub-bracket to parse array + $child[] = $part; + } // add to parse array + elseif ($b_offset > 0) + $child[] = $part; + // condition type + elseif (!is_array($part)) { + if (strtoupper($part) == 'AND') + $add = true; + elseif (strtoupper($part) == 'OR') + $or = true; + } else // skip + $ncond[] = $part; + } + if ($b_offset > 0) + trigger_error(self::E_BRACKETS); + if (isset($add)) + return array('$and' => $ncond); + elseif (isset($or)) + return array('$or' => $ncond); + else + return $ncond[0]; + } + + /** + * find and convert relational operators + * @param $part + * @param $args + * @param null $fieldConf + * @return array|null + */ + protected function _mongo_parse_relational_op($part, &$args, $fieldConf=null) + { + if (is_null($part)) + return $part; + if (preg_match('/\<\=|\>\=|\<\>|\<|\>|\!\=|\=\=|\=|like|not like|in|not in/i', $part, $match)) { + $var = is_int(strpos($part, '?')) ? array_shift($args) : null; + $exp = explode($match[0], $part); + $key = trim($exp[0]); + // unbound value + if (is_numeric($exp[1])) + $var = $exp[1]; + // field comparison + elseif (!is_int(strpos($exp[1], '?'))) + return array('$where' => 'this.'.$key.' '.$match[0].' this.'.trim($exp[1])); + $upart = strtoupper($match[0]); + // MongoID shorthand + if ($key == '_id' || (isset($fieldConf[$key]) && isset($fieldConf[$key]['relType']))) { + if (is_array($var)) + foreach ($var as &$id) { + if (!$id instanceof \MongoId) + $id = new \MongoId($id); + unset($id); + } + elseif(!$var instanceof \MongoId) + $var = new \MongoId($var); + } + // find LIKE operator + if (in_array($upart, array('LIKE','NOT LIKE'))) { + $rgx = $this->_likeValueToRegEx($var); + $var = new \MongoRegex($rgx); + if ($upart == 'NOT LIKE') + $var = array('$not' => $var); + } // find IN operator + elseif (in_array($upart, array('IN','NOT IN'))) { + $var = array(($upart=='NOT IN')?'$nin':'$in' => array_values($var)); + } // translate operators + elseif (!in_array($match[0], array('==', '='))) { + $opr = str_replace(array('<>', '<', '>', '!', '='), + array('$ne', '$lt', '$gt', '$n', 'e'), $match[0]); + $var = array($opr => (strtolower($var) == 'null') ? null : + (is_object($var) ? $var : (is_numeric($var) ? $var + 0 : $var))); + } + return array($key => $var); + } + return $part; + } + + /** + * @param string $var + * @return string + */ + protected function _likeValueToRegEx($var) + { + $lC = substr($var, -1, 1); + // %var% -> /var/ + if ($var[0] == '%' && $lC == '%') + $var = '/'.substr($var, 1, -1).'/'; + // var% -> /^var/ + elseif ($lC == '%') + $var = '/^'.substr($var, 0, -1).'/'; + // %var -> /var$/ + elseif ($var[0] == '%') + $var = '/'.substr($var, 1).'$/'; + return $var; + } + + /** + * convert options array syntax to given engine type + * + * example: + * array('order'=>'location') // default direction is ASC + * array('order'=>'num1 desc, num2 asc') + * + * @param array $options + * @param string $engine + * @return array|null + */ + public function prepareOptions($options, $engine) + { + if (empty($options) || !is_array($options)) + return null; + switch ($engine) { + case 'jig': + if (array_key_exists('order', $options)) + $options['order'] = str_replace(array('asc', 'desc'), + array('SORT_ASC', 'SORT_DESC'), strtolower($options['order'])); + break; + case 'mongo': + if (array_key_exists('order', $options)) { + $sorts = explode(',', $options['order']); + $sorting = array(); + foreach ($sorts as $sort) { + $sp = explode(' ', trim($sort)); + $sorting[$sp[0]] = (array_key_exists(1, $sp) && + strtoupper($sp[1]) == 'DESC') ? -1 : 1; + } + $options['order'] = $sorting; + } + if (array_key_exists('group', $options) && is_string($options['group'])) { + $keys = explode(',',$options['group']); + $options['group']=array('keys'=>array(),'initial'=>array(),'reduce'=>'function (obj, prev) {}','finalize'=>''); + $keys = array_combine($keys,array_fill(0,count($keys),1)); + $options['group']['keys']=$keys; + $options['group']['initial']=$keys; + } + break; + } + return $options; + } +} + +class CortexCollection extends \ArrayIterator { + + protected + $relSets = array(), + $pointer = 0, + $cid; + + const + E_UnknownCID = 'This Collection does not exist: %s', + E_SubsetKeysValue = '$keys must be an array or split-able string, but %s was given.'; + + public function __construct() { + $this->cid = uniqid('cortex_collection_'); + \Registry::set($this->cid,$this); + parent::__construct(); + } + + public function __destruct() { + // free embedded relation cache from memory + \Registry::clear($this->cid); + } + + //! Prohibit cloning to ensure an existing relation cache + private function __clone() { } + + /** + * set a collection of models + * @param $models + */ + function setModels($models) { + array_map(array($this,'add'),$models); + } + + /** + * add single model to collection + * @param $model + */ + function add(Cortex $model) + { + $model->addToCollection($this->cid); + $this->append($model); + } + + /** + * get a related collection + * @param $key + * @return null + */ + public function getRelSet($key) { + return (isset($this->relSets[$key])) ? $this->relSets[$key] : null; + } + + /** + * set a related collection for caching it for the lifetime of this collection + * @param $key + * @param $set + */ + public function setRelSet($key,$set) { + $this->relSets[$key] = $set; + } + + /** + * check if a related collection exists in runtime cache + * @param $key + * @return bool + */ + public function hasRelSet($key) { + return array_key_exists($key,$this->relSets); + } + + public function expose() { + return $this->getArrayCopy(); + } + + /** + * get an intersection from a cached relation-set, based on given keys + * @param string $prop + * @param array|string $keys + * @return array + */ + public function getSubset($prop,$keys) { + if (is_string($keys)) + $keys = \Base::instance()->split($keys); + if (!is_array($keys)) + trigger_error(sprintf(self::E_SubsetKeysValue,gettype($keys))); + if (!$this->hasRelSet($prop) || !($relSet = $this->getRelSet($prop))) + return null; + foreach ($keys as &$key) + if ($key instanceof \MongoId) + $key = (string) $key; + return array_values(array_intersect_key($relSet, array_flip($keys))); + } + + /** + * returns all values of a specified property from all models + * @param string $prop + * @param bool $raw + * @return array + */ + public function getAll($prop, $raw = false) + { + $out = array(); + foreach ($this->getArrayCopy() as $model) + if ($model->exists($prop,true)) { + $val = $model->get($prop, $raw); + if (!empty($val)) + $out[] = $val; + } + return $out; + } + + /** + * cast all contained mappers to a nested array + * @param int $rel_depths depths to resolve relations + * @return array + */ + public function castAll($rel_depths=1) { + $out = array(); + foreach ($this->getArrayCopy() as $model) + $out[] = $model->cast(null,$rel_depths); + return $out; + } + + /** + * return all models keyed by a specified index key + * @param string $index + * @param bool $nested + * @return array + */ + public function getBy($index, $nested = false) + { + $out = array(); + foreach ($this->getArrayCopy() as $model) + if ($model->exists($index)) { + $val = $model->get($index, true); + if (!empty($val)) + if($nested) $out[(string) $val][] = $model; + else $out[(string) $val] = $model; + } + return $out; + } + + /** + * re-assort the current collection using a sql-like syntax + * @param $cond + */ + public function orderBy($cond){ + $cols=\Base::instance()->split($cond); + $this->uasort(function($val1,$val2) use($cols) { + foreach ($cols as $col) { + $parts=explode(' ',$col,2); + $order=empty($parts[1])?'ASC':$parts[1]; + $col=$parts[0]; + list($v1,$v2)=array($val1[$col],$val2[$col]); + if ($out=strnatcmp($v1,$v2)* + ((strtoupper($order)=='ASC')*2-1)) + return $out; + } + return 0; + }); + } + + /** + * slice the collection + * @param $offset + * @param null $limit + */ + public function slice($offset,$limit=null) { + $this->rewind(); + $i=0; + $del=array(); + while ($this->valid()) { + if ($i < $offset) + $del[]=$this->key(); + elseif ($i >= $offset && $limit && $i >= ($offset+$limit)) + $del[]=$this->key(); + $i++; + $this->next(); + } + foreach ($del as $ii) + unset($this[$ii]); + } + + /** + * @param $cid + * @return CortexCollection + */ + static public function instance($cid) { + if (!\Registry::exists($cid)) + trigger_error(sprintf(self::E_UnknownCID, $cid)); + return \Registry::get($cid); + } + +} \ No newline at end of file diff --git a/app/lib/db/sql/schema.php b/app/lib/db/sql/schema.php new file mode 100644 index 00000000..eae536b3 --- /dev/null +++ b/app/lib/db/sql/schema.php @@ -0,0 +1,1186 @@ + + * https://github.com/ikkez/F3-Sugar/ + * + * @package DB + * @version 2.1.1 + **/ + + +namespace DB\SQL; + +use DB\SQL; + +class Schema extends DB_Utils { + + public + $dataTypes = array( + 'BOOLEAN' => array('mysql|sqlite2?|pgsql' => 'BOOLEAN', + 'mssql|sybase|dblib|odbc|sqlsrv' => 'bit', + 'ibm' => 'numeric(1,0)', + ), + 'INT1' => array('mysql' => 'TINYINT UNSIGNED', + 'sqlite2?' => 'integer', + 'mssql|sybase|dblib|odbc|sqlsrv' => 'tinyint', + 'pgsql|ibm' => 'smallint', + ), + 'INT2' => array('mysql' => 'SMALLINT', + 'sqlite2?' => 'integer', + 'pgsql|ibm|mssql|sybase|dblib|odbc|sqlsrv' => 'smallint', + ), + 'INT4' => array('sqlite2?|pgsql|sybase|odbc|sqlsrv|imb' => 'integer', + 'mysql|mssql|dblib' => 'int', + ), + 'INT8' => array('sqlite2?' => 'integer', + 'pgsql|mysql|mssql|sybase|dblib|odbc|sqlsrv|imb' => 'bigint', + ), + 'FLOAT' => array('mysql|sqlite2?' => 'FLOAT', + 'pgsql' => 'double precision', + 'mssql|sybase|dblib|odbc|sqlsrv' => 'float', + 'imb' => 'decfloat' + ), + 'DOUBLE' => array('mysql|sqlite2?|ibm' => 'DOUBLE', + 'pgsql|sybase|odbc|sqlsrv' => 'double precision', + 'mssql|dblib' => 'decimal', + ), + 'VARCHAR128' => array('mysql|pgsql|sqlite2?|ibm|mssql|sybase|dblib|odbc|sqlsrv' => 'varchar(128)', + ), + 'VARCHAR256' => array('mysql|pgsql|sqlite2?|ibm|mssql|sybase|dblib|odbc|sqlsrv' => 'varchar(255)', + ), + 'VARCHAR512' => array('mysql|pgsql|sqlite2?|ibm|mssql|sybase|dblib|odbc|sqlsrv' => 'varchar(512)', + ), + 'TEXT' => array('mysql|sqlite2?|pgsql|mssql' => 'text', + 'sybase|dblib|odbc|sqlsrv' => 'nvarchar(max)', + 'ibm' => 'BLOB SUB_TYPE TEXT', + ), + 'LONGTEXT' => array('mysql' => 'LONGTEXT', + 'sqlite2?|pgsql|mssql' => 'text', + 'sybase|dblib|odbc|sqlsrv' => 'nvarchar(max)', + 'ibm' => 'CLOB(2000000000)', + ), + 'DATE' => array('mysql|sqlite2?|pgsql|mssql|sybase|dblib|odbc|sqlsrv|ibm' => 'date', + ), + 'DATETIME' => array('pgsql' => 'timestamp without time zone', + 'mysql|sqlite2?|mssql|sybase|dblib|odbc|sqlsrv' => 'datetime', + 'ibm' => 'timestamp', + ), + 'TIMESTAMP' => array('mysql|ibm' => 'timestamp', + 'pgsql|odbc' => 'timestamp without time zone', + 'sqlite2?|mssql|sybase|dblib|sqlsrv'=>'DATETIME', + ), + 'BLOB' => array('mysql|odbc|sqlite2?|ibm' => 'blob', + 'pgsql' => 'bytea', + 'mssql|sybase|dblib' => 'image', + 'sqlsrv' => 'varbinary(max)', + ), + ), + $defaultTypes = array( + 'CUR_STAMP' => array('mysql' => 'CURRENT_TIMESTAMP', + 'mssql|sybase|dblib|odbc|sqlsrv' => 'getdate()', + 'pgsql' => 'LOCALTIMESTAMP(0)', + 'sqlite2?' => "(datetime('now','localtime'))", + ), + ); + + public + $name; + + /** @var \Base */ + protected $fw; + + const + // DataTypes and Aliases + DT_BOOL = 'BOOLEAN', + DT_BOOLEAN = 'BOOLEAN', + DT_INT1 = 'INT1', + DT_TINYINT = 'INT1', + DT_INT2 = 'INT2', + DT_SMALLINT = 'INT2', + DT_INT4 = 'INT4', + DT_INT = 'INT4', + DT_INT8 = 'INT8', + DT_BIGINT = 'INT8', + DT_FLOAT = 'FLOAT', + DT_DOUBLE = 'DOUBLE', + DT_DECIMAL = 'DOUBLE', + DT_VARCHAR128 = 'VARCHAR128', + DT_VARCHAR256 = 'VARCHAR256', + DT_VARCHAR512 = 'VARCHAR512', + DT_TEXT = 'TEXT', + DT_LONGTEXT = 'LONGTEXT', + DT_DATE = 'DATE', + DT_DATETIME = 'DATETIME', + DT_TIMESTAMP = 'TIMESTAMP', + DT_BLOB = 'BLOB', + DT_BINARY = 'BLOB', + + // column default values + DF_CURRENT_TIMESTAMP = 'CUR_STAMP'; + + + public function __construct(\DB\SQL $db) + { + $this->fw = \Base::instance(); + parent::__construct($db); + } + + /** + * get a list of all databases + * @return array|bool + */ + public function getDatabases() + { + $cmd = array( + 'mysql' => 'SHOW DATABASES', + 'pgsql' => 'SELECT datname FROM pg_catalog.pg_database', + 'mssql|sybase|dblib|sqlsrv|odbc' => 'EXEC SP_HELPDB', + ); + $query = $this->findQuery($cmd); + if (!$query) return false; + $result = $this->db->exec($query); + if (!is_array($result)) return false; + foreach($result as &$db) + if (is_array($db)) $db = array_shift($db); + return $result; + } + + /** + * get all tables of current DB + * @return bool|array list of tables, or false + */ + public function getTables() + { + $cmd = array( + 'mysql' => array( + "show tables"), + 'sqlite2?' => array( + "SELECT name FROM sqlite_master WHERE type='table' AND name!='sqlite_sequence'"), + 'pgsql|sybase|dblib' => array( + "select table_name from information_schema.tables where table_schema = 'public'"), + 'mssql|sqlsrv|odbc' => array( + "select table_name from information_schema.tables"), + 'ibm' => array("select TABLE_NAME from sysibm.tables"), + ); + $query = $this->findQuery($cmd); + if (!$query[0]) return false; + $tables = $this->db->exec($query[0]); + if ($tables && is_array($tables) && count($tables) > 0) + foreach ($tables as &$table) + $table = array_shift($table); + return $tables; + } + + /** + * returns a table object for creation + * @param $name + * @return bool|TableCreator + */ + public function createTable($name) + { + return new TableCreator($name,$this); + } + + /** + * returns a table object for altering operations + * @param $name + * @return bool|TableModifier + */ + public function alterTable($name) + { + return new TableModifier($name,$this); + } + + /** + * rename a table + * @param string $name + * @param string $new_name + * @param bool $exec + * @return bool + */ + public function renameTable($name, $new_name, $exec = true) + { + $name = $this->db->quotekey($name); + $new_name = $this->db->quotekey($new_name); + if (preg_match('/odbc/', $this->db->driver())) { + $queries = array(); + $queries[] = "SELECT * INTO $new_name FROM $name;"; + $queries[] = $this->dropTable($name, false); + return ($exec) ? $this->db->exec($queries) : implode("\n",$queries); + } else { + $cmd = array( + 'sqlite2?|pgsql' => + "ALTER TABLE $name RENAME TO $new_name;", + 'mysql|ibm' => + "RENAME TABLE $name TO $new_name;", + 'mssql|sqlsrv|sybase|dblib|odbc' => + "sp_rename {$name}, $new_name" + ); + $query = $this->findQuery($cmd); + if (!$exec) return $query; + return (preg_match('/mssql|sybase|dblib|sqlsrv/', $this->db->driver())) + ? @$this->db->exec($query) : $this->db->exec($query); + } + } + + /** + * drop a table + * @param \DB\SQL\TableBuilder|string $name + * @param bool $exec + * @return bool + */ + public function dropTable($name, $exec = true) + { + if (is_object($name) && $name instanceof TableBuilder) + $name = $name->name; + $cmd = array( + 'mysql|ibm|sqlite2?|pgsql|sybase|dblib' => + 'DROP TABLE IF EXISTS '.$this->db->quotekey($name).';', + 'mssql|sqlsrv|odbc' => + "IF OBJECT_ID('[$name]', 'U') IS NOT NULL DROP TABLE [$name];" + ); + $query = $this->findQuery($cmd); + return ($exec) ? $this->db->exec($query) : $query; + } + +} + +abstract class TableBuilder extends DB_Utils { + + protected $columns, $pkeys, $queries, $increments, $rebuild_cmd, $suppress; + public $name, $schema; + + const + TEXT_NoDefaultForTEXT = "Column `%s` of type TEXT can't have a default value.", + TEXT_ColumnExists = "Cannot add the column `%s`. It already exists."; + + /** + * @param string $name + * @param Schema $schema + * @return \DB\SQL\TableBuilder + */ + public function __construct($name, Schema $schema) + { + $this->name = $name; + $this->schema = $schema; + $this->columns = array(); + $this->queries = array(); + $this->pkeys = array('id'); + $this->increments = 'id'; + parent::__construct($schema->db); + } + + /** + * generate SQL query and execute it if $exec is true + * @param bool $exec + */ + abstract public function build($exec = TRUE); + + /** + * add a new column to this table + * @param string|Column $key column name or object + * @param null|array $args optional config array + * @return \DB\SQL\Column + */ + public function addColumn($key,$args = null) + { + if ($key instanceof Column) { + $args = $key->getColumnArray(); + $key = $key->name; + } + if (array_key_exists($key,$this->columns)) + trigger_error(sprintf(self::TEXT_ColumnExists,$key)); + $column = new Column($key, $this); + if ($args) + foreach ($args as $arg => $val) + $column->{$arg} = $val; + // skip default pkey field + if (count($this->pkeys) == 1 && in_array($key,$this->pkeys)) + return $column; + return $this->columns[$key] =& $column; + } + + /** + * create index on one or more columns + * @param string|array $index_cols Column(s) to be indexed + * @param $search_cols + * @param bool $unique Unique index + * @param int $length index length for text fields in mysql + */ + protected function _addIndex($index_cols, $search_cols, $unique, $length) + { + if (!is_array($index_cols)) + $index_cols = array($index_cols); + $quotedCols = array_map(array($this->db, 'quotekey'), $index_cols); + if (preg_match('/mysql/', $this->db->driver())) + foreach($quotedCols as $i=>&$col) + if(strtoupper($search_cols[$index_cols[$i]]['type']) == 'TEXT') + $col.='('.$length.')'; + $cols = implode(',', $quotedCols); + $name = $this->db->quotekey($this->name.'___'.implode('__', $index_cols)); + $table = $this->db->quotekey($this->name); + $index = $unique ? 'UNIQUE INDEX' : 'INDEX'; + $cmd = array( + 'pgsql|sqlite2?|ibm|mssql|sybase|dblib|odbc|sqlsrv' => + "CREATE $index $name ON $table ($cols);", + 'mysql' => //ALTER TABLE is used because of MySQL bug #48875 + "ALTER TABLE $table ADD $index $name ($cols);", + ); + $query = $this->findQuery($cmd); + $this->queries[] = $query; + } + + /** + * set primary / composite key to table + * @param string|array $pkeys + * @return bool + */ + public function primary($pkeys) { + if (empty($pkeys)) + return false; + if (!is_array($pkeys)) + $pkeys = array($pkeys); + // single pkey + $this->increments = $pkeys[0]; + $this->pkeys = $pkeys; + // drop duplicate pkey definition + if (array_key_exists($this->increments,$this->columns)) + unset($this->columns[$this->increments]); + // set flag on new fields + foreach ($pkeys as $name) + if(array_key_exists($name,$this->columns)) + $this->columns[$name]->pkey = true; + // composite key + if (count($pkeys) > 1) { + $pkeys_quoted = array_map(array($this->db,'quotekey'), $pkeys); + $pk_string = implode(', ', $pkeys_quoted); + if (preg_match('/sqlite2?/', $this->db->driver())) { + // rebuild table with new primary keys + $this->rebuild_cmd['pkeys'] = $pkeys; + return; + } else { + $table = $this->db->quotekey($this->name); + $table_key = $this->db->quotekey($this->name.'_pkey'); + $cmd = array( + 'odbc' => + "CREATE INDEX $table_key ON $table ( $pk_string );", + 'mysql' => + "ALTER TABLE $table DROP PRIMARY KEY, ADD PRIMARY KEY ( $pk_string );", + 'mssql|sybase|dblib|sqlsrv' => array( + "ALTER TABLE $table DROP CONSTRAINT PK_".$this->name."_ID;", + "ALTER TABLE $table ADD CONSTRAINT $table_key PRIMARY KEY ( $pk_string );", + ), + 'pgsql' => array( + "ALTER TABLE $table DROP CONSTRAINT $table_key;", + "ALTER TABLE $table ADD CONSTRAINT $table_key PRIMARY KEY ( $pk_string );", + ), + ); + $query = $this->findQuery($cmd); + if (!is_array($query)) + $query = array($query); + foreach ($query as $q) + $this->queries[] = $q; + } + } + } + +} + +class TableCreator extends TableBuilder { + + const + TEXT_TableAlreadyExists = "Table `%s` already exists. Cannot create it."; + + /** + * generate SQL query for creating a basic table, containing an ID serial field + * and execute it if $exec is true, otherwise just return the generated query string + * @param bool $exec + * @return bool|TableModifier|string + */ + public function build($exec = TRUE) + { + // check if already existing + if ($exec && in_array($this->name, $this->schema->getTables())) { + trigger_error(sprintf(self::TEXT_TableAlreadyExists,$this->name)); + return false; + } + $cols = ''; + if (!empty($this->columns)) + foreach ($this->columns as $cname => $column) { + // no defaults for TEXT type + if ($column->default !== false && is_int(strpos(strtoupper($column->type),'TEXT'))) { + trigger_error(sprintf(self::TEXT_NoDefaultForTEXT, $column->name)); + return false; + } + $cols .= ', '.$column->getColumnQuery(); + } + $table = $this->db->quotekey($this->name); + $id = $this->db->quotekey($this->increments); + $cmd = array( + 'sqlite2?|sybase|dblib' => + "CREATE TABLE $table ($id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT".$cols.");", + 'mysql' => + "CREATE TABLE $table ($id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT".$cols.") DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci;", + 'pgsql' => + "CREATE TABLE $table ($id SERIAL PRIMARY KEY".$cols.");", + 'mssql|odbc|sqlsrv' => + "CREATE TABLE $table ($id INT IDENTITY CONSTRAINT PK_".$this->name."_ID PRIMARY KEY".$cols.");", + 'ibm' => + "CREATE TABLE $table ($id INTEGER AS IDENTITY NOT NULL $cols, PRIMARY KEY($id));", + ); + $query = $this->findQuery($cmd); + // composite key for sqlite + if (count($this->pkeys) > 1 && preg_match('/sqlite2?/', $this->db->driver())) { + $pk_string = implode(', ', $this->pkeys); + $query = "CREATE TABLE $table ($id INTEGER NULL".$cols.", PRIMARY KEY ($pk_string) );"; + $newTable = new TableModifier($this->name, $this->schema); + // auto-incrementation in composite primary keys + $pk_queries = $newTable->_sqlite_increment_trigger($this->increments); + $this->queries = array_merge($this->queries, $pk_queries); + } + array_unshift($this->queries, $query); + // indexes + foreach ($this->columns as $cname => $column) + if ($column->index) + $this->addIndex($cname, $column->unique); + if (!$exec) + return $this->queries; + $this->db->exec($this->queries); + return isset($newTable) ? $newTable : new TableModifier($this->name,$this->schema); + } + + /** + * create index on one or more columns + * @param string|array $columns Column(s) to be indexed + * @param bool $unique Unique index + * @param int $length index length for text fields in mysql + */ + public function addIndex($columns, $unique = FALSE, $length = 20) + { + if (!is_array($columns)) + $columns = array($columns); + $cols = $this->columns; + foreach ($cols as &$col) + $col = $col->getColumnArray(); + parent::_addIndex($columns,$cols,$unique,$length); + } + +} + + +class TableModifier extends TableBuilder { + + protected + $colTypes, $rebuild_cmd; + + const + // error messages + TEXT_TableNotExisting = "Unable to alter table `%s`. It does not exist.", + TEXT_NotNullFieldNeedsDefault = 'You cannot add the not nullable column `%s` without specifying a default value', + TEXT_ENGINE_NOT_SUPPORTED = 'DB Engine `%s` is not supported for this action.'; + + /** + * generate SQL queries for altering the table and execute it if $exec is true, + * otherwise return the generated query string + */ + public function build($exec = TRUE) + { + // check if table exists + if (!in_array($this->name, $this->schema->getTables())) + trigger_error(sprintf(self::TEXT_TableNotExisting, $this->name)); + + if ($sqlite = preg_match('/sqlite2?/', $this->db->driver())) { + $sqlite_queries = array(); + } + $rebuild = false; + $additional_queries = $this->queries; + $this->queries = array(); + // add new columns + foreach ($this->columns as $cname => $column) { + // not nullable fields should have a default value, when altering a table + if ($column->default === false && $column->nullable === false) { + trigger_error(sprintf(self::TEXT_NotNullFieldNeedsDefault, $column->name)); + return false; + } + // no defaults for TEXT type + if($column->default !== false && is_int(strpos(strtoupper($column->type),'TEXT'))) { + trigger_error(sprintf(self::TEXT_NoDefaultForTEXT, $column->name)); + return false; + } + $table = $this->db->quotekey($this->name); + $col_query = $column->getColumnQuery(); + if ($sqlite) { + // sqlite: dynamic column default only works when rebuilding the table + if($column->default === Schema::DF_CURRENT_TIMESTAMP) { + $rebuild = true; + break; + } else + $sqlite_queries[] = "ALTER TABLE $table ADD $col_query;"; + } else { + $cmd = array( + 'mysql|pgsql|mssql|sybase|dblib|odbc|sqlsrv' => + "ALTER TABLE $table ADD $col_query;", + 'ibm' => + "ALTER TABLE $table ADD COLUMN $col_query;", + ); + $this->queries[] = $this->findQuery($cmd); + } + } + if ($sqlite) + if ($rebuild || !empty($this->rebuild_cmd)) $this->_sqlite_rebuild($exec); + else $this->queries += $sqlite_queries; + $this->queries = array_merge($this->queries,$additional_queries); + // add new indexes + foreach ($this->columns as $cname => $column) + if ($column->index) + $this->addIndex($cname, $column->unique); + if (empty($this->queries)) + return false; + if (is_array($this->queries) && count($this->queries) == 1) + $this->queries = $this->queries[0]; + if (!$exec) return $this->queries; + $result = ($this->suppress) + ? @$this->db->exec($this->queries) : $this->db->exec($this->queries); + $this->queries = $this->columns = $this->rebuild_cmd = array(); + return $result; + } + + /** + * rebuild a sqlite table with additional schema changes + */ + protected function _sqlite_rebuild($exec=true) + { + $new_columns = $this->columns; + $existing_columns = $this->getCols(true); + // find after sorts + $after = array(); + foreach ($new_columns as $cname => $column) + if(!empty($column->after)) + $after[$column->after][] = $cname; + // find rename commands + $rename = (!empty($this->rebuild_cmd) && array_key_exists('rename',$this->rebuild_cmd)) + ? $this->rebuild_cmd['rename'] : array(); + // get primary-key fields + foreach ($existing_columns as $key => $col) + if ($col['pkey']) + $pkeys[array_key_exists($key,$rename) ? $rename[$key] : $key] = $col; + foreach ($new_columns as $key => $col) + if ($col->pkey) + $pkeys[$key] = $col; + // indexes + $indexes = $this->listIndex(); + // drop fields + if (!empty($this->rebuild_cmd) && array_key_exists('drop', $this->rebuild_cmd)) + foreach ($this->rebuild_cmd['drop'] as $name) + if (array_key_exists($name, $existing_columns)) { + if (array_key_exists($name, $pkeys)) { + unset($pkeys[$name]); + // drop composite key + if(count($pkeys) == 1) { + $incrementTrigger = $this->db->quotekey($this->name.'_insert'); + $this->queries[] = 'DROP TRIGGER IF EXISTS '.$incrementTrigger; + } + } + unset($existing_columns[$name]); + // drop index + foreach (array_keys($indexes) as $col) { + // for backward compatibility + if ($col == $name) + unset($indexes[$name]); + // new index names + if ($col == $this->name.'___'.$name) + unset($indexes[$this->name.'___'.$name]); + // check if column is part of an existing combined index + if (is_int(strpos($col, '__'))) { + if (is_int(strpos($col, '___'))) { + $col = explode('___', $col); + $ci = explode('__', $col[1]); + $col = implode('___',$col); + } else // for backward compatibility + $ci = explode('__', $col); + // drop combined index + if (in_array($name, $ci)) + unset($indexes[$col]); + } + } + } + // create new table + $oname = $this->name; + $this->queries[] = $this->rename($oname.'_temp', false); + $newTable = $this->schema->createTable($oname); + // add existing fields + foreach ($existing_columns as $name => $col) { + $colName = array_key_exists($name, $rename) ? $rename[$name] : $name; + // update column datatype + if (array_key_exists('update',$this->rebuild_cmd) + && in_array($name,array_keys($this->rebuild_cmd['update']))) + $col['type']=$this->rebuild_cmd['update'][$name]; + $newTable->addColumn($colName, $col)->passThrough(); + // add new fields with after flag + if (array_key_exists($name,$after)) + foreach (array_reverse($after[$name]) as $acol) { + $newTable->addColumn($new_columns[$acol]); + unset($new_columns[$acol]); + } + } + // add remaining new fields + foreach ($new_columns as $ncol) + $newTable->addColumn($ncol); + $newTable->primary(array_keys($pkeys)); + // add existing indexes + foreach (array_reverse($indexes) as $name=>$conf) { + if (is_int(strpos($name, '___'))) + list($tname,$name) = explode('___', $name); + if (is_int(strpos($name, '__'))) + $name = explode('__', $name); + if ($exec) { + $t = $this->schema->alterTable($oname); + $t->dropIndex($name); + $t->build(); + } + $newTable->addIndex($name,$conf['unique']); + } + // build new table + $newTableQueries = $newTable->build(false); + $this->queries = array_merge($this->queries,$newTableQueries); + // copy data + if (!empty($existing_columns)) { + foreach (array_keys($existing_columns) as $name) { + $fields_from[] = $this->db->quotekey($name); + $toName = array_key_exists($name, $rename) ? $rename[$name] : $name; + $fields_to[] = $this->db->quotekey($toName); + } + $this->queries[] = + 'INSERT INTO '.$this->db->quotekey($newTable->name).' ('.implode(', ', $fields_to).') '. + 'SELECT '.implode(', ', $fields_from).' FROM '.$this->db->quotekey($this->name).';'; + } + $this->queries[] = $this->drop(false); + $this->name = $oname; + } + + /** + * create an insert trigger to work-a-round auto-incrementation in composite primary keys + * @param $pkey + * @return array + */ + public function _sqlite_increment_trigger($pkey) { + $table = $this->db->quotekey($this->name); + $pkey = $this->db->quotekey($pkey); + $triggerName = $this->db->quotekey($this->name.'_insert'); + $queries[] = "DROP TRIGGER IF EXISTS $triggerName;"; + $queries[] = 'CREATE TRIGGER '.$triggerName.' AFTER INSERT ON '.$table. + ' WHEN (NEW.'.$pkey.' IS NULL) BEGIN'. + ' UPDATE '.$table.' SET '.$pkey.' = ('. + ' select coalesce( max( '.$pkey.' ), 0 ) + 1 from '.$table. + ') WHERE ROWID = NEW.ROWID;'. + ' END;'; + return $queries; + } + + /** + * get columns of a table + * @param bool $types + * @return array + */ + public function getCols($types = false) + { + $schema = $this->db->schema($this->name, null, 0); + if (!$types) + return array_keys($schema); + else + foreach ($schema as $name => &$cols) { + $default = ($cols['default'] === '') ? null : $cols['default']; + if (!is_null($default) && ( + (is_int(strpos($curdef=$this->findQuery($this->schema->defaultTypes['CUR_STAMP']), + $default)) || is_int(strpos($default,$curdef))) + || $default == "('now'::text)::timestamp(0) without time zone")) + { + $default = 'CUR_STAMP'; + } elseif (!is_null($default)) { + // remove single-qoutes + if (preg_match('/sqlite2?/', $this->db->driver())) + $default=preg_replace('/^\s*([\'"])(.*)\1\s*$/','\2',$default); + elseif (preg_match('/mssql|sybase|dblib|odbc|sqlsrv/', $this->db->driver())) + $default=preg_replace('/^\s*(\(\')(.*)(\'\))\s*$/','\2',$default); + // extract value from character_data in postgre + elseif (preg_match('/pgsql/', $this->db->driver())) + if (is_int(strpos($default, 'nextval'))) + $default = null; // drop autoincrement default + elseif (preg_match("/^\'*(.*)\'*::(\s*\w)+/", $default, $match)) + $default = $match[1]; + } else + $default=false; + $cols['default'] = $default; + } + return $schema; + } + + /** + * removes a column from a table + * @param string $name + * @return bool + */ + public function dropColumn($name) + { + $colTypes = $this->getCols(true); + // check if column exists + if (!in_array($name, array_keys($colTypes))) return true; + if (preg_match('/sqlite2?/', $this->db->driver())) { + // SQlite does not support drop column directly + $this->rebuild_cmd['drop'][] = $name; + } else { + $quotedTable = $this->db->quotekey($this->name); + $quotedColumn = $this->db->quotekey($name); + $cmd = array( + 'mysql' => + "ALTER TABLE $quotedTable DROP $quotedColumn;", + 'pgsql|odbc|ibm|mssql|sybase|dblib|sqlsrv' => + "ALTER TABLE $quotedTable DROP COLUMN $quotedColumn;", + ); + if (preg_match('/mssql|sybase|dblib|sqlsrv/', $this->db->driver())) + $this->suppress=true; + $this->queries[] = $this->findQuery($cmd); + } + } + + /** + * rename a column + * @param $name + * @param $new_name + * @return void + */ + public function renameColumn($name, $new_name) + { + $existing_columns = $this->getCols(true); + // check if column is already existing + if (!in_array($name, array_keys($existing_columns))) + trigger_error('cannot rename column. it does not exist.'); + if (in_array($new_name, array_keys($existing_columns))) + trigger_error('cannot rename column. new column already exist.'); + + if (preg_match('/sqlite2?/', $this->db->driver())) + // SQlite does not support drop or rename column directly + $this->rebuild_cmd['rename'][$name] = $new_name; + elseif (preg_match('/odbc/', $this->db->driver())) { + // no rename column for odbc, create temp column + $this->addColumn($new_name, $existing_columns[$name])->passThrough(); + $this->queries[] = "UPDATE $this->name SET $new_name = $name"; + $this->dropColumn($name); + } else { + $existing_columns = $this->getCols(true); + $quotedTable = $this->db->quotekey($this->name); + $quotedColumn = $this->db->quotekey($name); + $quotedColumnNew = $this->db->quotekey($new_name); + $cmd = array( + 'mysql' => + "ALTER TABLE $quotedTable CHANGE $quotedColumn $quotedColumnNew ".$existing_columns[$name]['type'].";", + 'pgsql|ibm' => + "ALTER TABLE $quotedTable RENAME COLUMN $quotedColumn TO $quotedColumnNew;", + 'mssql|sybase|dblib|sqlsrv' => + "sp_rename [$this->name.$name], '$new_name', 'Column'", + ); + if (preg_match('/mssql|sybase|dblib|sqlsrv/', $this->db->driver())) + $this->suppress = true; + $this->queries[] = $this->findQuery($cmd); + } + } + + /** + * modifies column datatype + * @param $name + * @param $datatype + * @param bool $force + * @return bool + */ + public function updateColumn($name, $datatype, $force = false) + { + if(!$force) + $datatype = $this->findQuery($this->schema->dataTypes[strtoupper($datatype)]); + $table = $this->db->quotekey($this->name); + $column = $this->db->quotekey($name); + if (preg_match('/sqlite2?/', $this->db->driver())){ + $this->rebuild_cmd['update'][$name] = $datatype; + } else { + $cmd = array( + 'mysql' => + "ALTER TABLE $table MODIFY COLUMN $column $datatype;", + 'pgsql' => + "ALTER TABLE $table ALTER COLUMN $column TYPE $datatype;", + 'sqlsrv|mssql|sybase|dblib|ibm' => + "ALTER TABLE $table ALTER COLUMN $column $datatype;", + ); + $this->queries[] = $this->findQuery($cmd); + } + } + + /** + * create index on one or more columns + * @param string|array $columns Column(s) to be indexed + * @param bool $unique Unique index + * @param int $length index length for text fields in mysql + */ + public function addIndex($columns, $unique = FALSE, $length = 20) + { + if (!is_array($columns)) + $columns = array($columns); + $existingCol = $this->columns; + foreach ($existingCol as &$col) + $col = $col->getColumnArray(); + $allCols = array_merge($this->getCols(true), $existingCol); + parent::_addIndex($columns, $allCols, $unique, $length); + } + + /** + * drop a column index + * @param string|array $name + */ + public function dropIndex($name) + { + if (is_array($name)) + $name = $this->name.'___'.implode('__', $name); + elseif(!is_int(strpos($name,'___'))) + $name = $this->name.'___'.$name; + $name = $this->db->quotekey($name); + $table = $this->db->quotekey($this->name); + $cmd = array( + 'pgsql|sqlite2?|ibm' => + "DROP INDEX $name;", + 'mssql|sybase|dblib|odbc|sqlsrv' => + "DROP INDEX $table.$name;", + 'mysql'=> + "ALTER TABLE $table DROP INDEX $name;", + ); + $query = $this->findQuery($cmd); + $this->queries[] = $query; + } + + /** + * returns table indexes as assoc array + * @return array + */ + public function listIndex() + { + $table = $this->db->quotekey($this->name); + $cmd = array( + 'sqlite2?' => + "PRAGMA index_list($table);", + 'mysql' => + "SHOW INDEX FROM $table;", + 'mssql|sybase|dblib|sqlsrv' => + "select * from sys.indexes ". + "where object_id = (select object_id from sys.objects where name = '$this->name')", + 'pgsql' => + "select i.relname as name, ix.indisunique as unique ". + "from pg_class t, pg_class i, pg_index ix ". + "where t.oid = ix.indrelid and i.oid = ix.indexrelid ". + "and t.relkind = 'r' and t.relname = '$this->name'". + "group by t.relname, i.relname, ix.indisunique;", + ); + $result = $this->db->exec($this->findQuery($cmd)); + $indexes = array(); + if (preg_match('/pgsql|sqlite2?/', $this->db->driver())) { + foreach($result as $row) + $indexes[$row['name']] = array('unique' => $row['unique']); + } elseif (preg_match('/mssql|sybase|dblib|sqlsrv/', $this->db->driver())) { + foreach ($result as $row) + $indexes[$row['name']] = array('unique' => $row['is_unique']); + } elseif (preg_match('/mysql/', $this->db->driver())) { + foreach($result as $row) + $indexes[$row['Key_name']] = array('unique' => !(bool)$row['Non_unique']); + } else + trigger_error(sprintf(self::TEXT_ENGINE_NOT_SUPPORTED, $this->db->driver())); + return $indexes; + } + + /** + * rename this table + * @param string $new_name + * @param bool $exec + * @return $this|bool + */ + public function rename($new_name, $exec = true) { + $query = $this->schema->renameTable($this->name, $new_name, $exec); + $this->name = $new_name; + return ($exec) ? $this : $query; + } + + /** + * drop this table + * @param bool $exec + * @return mixed + */ + public function drop($exec = true) { + return $this->schema->dropTable($this,$exec); + } + +} + +/** + * defines a table column configuration + * Class Column + * @package DB\SQL + */ +class Column extends DB_Utils { + + public $name, $type, $nullable, $default, $after, $index, $unique, $passThrough, $pkey; + protected $table, $schema; + + const + TEXT_NoDataType = 'The specified datatype %s is not defined in %s driver', + TEXT_CurrentStampDataType = 'Current timestamp as column default is only possible for TIMESTAMP datatype'; + + /** + * @param string $name + * @param TableBuilder $table + */ + public function __construct($name, TableBuilder $table) { + $this->name = $name; + $this->nullable = true; + $this->default = false; + $this->after = false; + $this->index = false; + $this->unique = false; + $this->passThrough = false; + $this->pkey = false; + + $this->table = $table; + $this->schema = $table->schema; + parent::__construct($this->schema->db); + } + + /** + * @param string $datatype + * @param bool $force don't match datatype against DT array + * @return $this + */ + public function type($datatype, $force = FALSE) { + $this->type = $datatype; + $this->passThrough = $force; + return $this; + } + + public function type_tinyint() { + $this->type = Schema::DT_INT1; + return $this; + } + + public function type_smallint() { + $this->type = Schema::DT_INT2; + return $this; + } + + public function type_int() { + $this->type = Schema::DT_INT4; + return $this; + } + + public function type_bigint() { + $this->type = Schema::DT_INT8; + return $this; + } + + public function type_float() { + $this->type = Schema::DT_FLOAT; + return $this; + } + + public function type_decimal() { + $this->type = Schema::DT_DOUBLE; + return $this; + } + + public function type_text() { + $this->type = Schema::DT_TEXT; + return $this; + } + + public function type_longtext() { + $this->type = Schema::DT_LONGTEXT; + return $this; + } + + public function type_varchar($length = 255) { + $this->type = "varchar($length)"; + $this->passThrough = true; + return $this; + } + + public function type_date() { + $this->type = Schema::DT_DATE; + return $this; + } + + public function type_datetime() { + $this->type = Schema::DT_DATETIME; + return $this; + } + + public function type_timestamp($asDefault=false) { + $this->type = Schema::DT_TIMESTAMP; + if ($asDefault) + $this->default = Schema::DF_CURRENT_TIMESTAMP; + return $this; + } + + public function type_blob() { + $this->type = Schema::DT_BLOB; + return $this; + } + + public function type_bool() { + $this->type = Schema::DT_BOOLEAN; + return $this; + } + + public function passThrough($state = TRUE) { + $this->passThrough = $state; + return $this; + } + + public function nullable($nullable) { + $this->nullable = $nullable; + return $this; + } + + public function defaults($default) { + $this->default = $default; + return $this; + } + + public function after($name) { + $this->after = $name; + return $this; + } + + public function index($unique = FALSE) { + $this->index = true; + $this->unique = $unique; + return $this; + } + + /** + * returns an array of this column configuration + * @return array + */ + public function getColumnArray() + { + $fields = array('name','type','passThrough','default','nullable', + 'index','unique','after','pkey'); + $fields = array_flip($fields); + foreach($fields as $key => &$val) + $val = $this->{$key}; + unset($val); + return $fields; + } + + /** + * generate SQL column definition query + * @return bool|string + */ + public function getColumnQuery() + { + if (!$this->type) + trigger_error(sprintf('Cannot build a column query for `%s`: no column type set',$this->name)); + // prepare column types + if ($this->passThrough) + $type_val = $this->type; + else { + $type_val = $this->findQuery($this->schema->dataTypes[strtoupper($this->type)]); + if (!$type_val) { + trigger_error(sprintf(self::TEXT_NoDataType, strtoupper($this->type), + $this->db->driver())); + return FALSE; + } + } + // build query + $query = $this->db->quotekey($this->name).' '.$type_val.' '. + ($this->nullable ? 'NULL' : 'NOT NULL'); + // default value + if ($this->default !== false) { + $def_cmds = array( + 'sqlite2?|mysql|pgsql|mssql|sybase|dblib|odbc|sqlsrv' => 'DEFAULT', + 'ibm' => 'WITH DEFAULT', + ); + $def_cmd = $this->findQuery($def_cmds).' '; + // timestamp default + if ($this->default === Schema::DF_CURRENT_TIMESTAMP) { + // check for right datatpye + $stamp_type = $this->findQuery($this->schema->dataTypes['TIMESTAMP']); + if ($this->type != 'TIMESTAMP' && // TODO: check that condition + ($this->passThrough && strtoupper($this->type) != strtoupper($stamp_type)) + ) + trigger_error(self::TEXT_CurrentStampDataType); + $def_cmd .= $this->findQuery($this->schema->defaultTypes[strtoupper($this->default)]); + } else { + // static defaults + $pdo_type = preg_match('/int|bool/i', $type_val, $parts) ? + constant('\PDO::PARAM_'.strtoupper($parts[0])) : \PDO::PARAM_STR; + $def_cmd .= ($this->default === NULL ? 'NULL' : + $this->db->quote(htmlspecialchars($this->default, ENT_QUOTES, + $this->f3->get('ENCODING')), $pdo_type)); + } + $query .= ' '.$def_cmd; + } + if (!empty($this->after)) { + // `after` feature only works for mysql + if (preg_match('/mysql/', $this->db->driver())) { + $after_cmd = 'AFTER '.$this->db->quotekey($this->after); + $query .= ' '.$after_cmd; + } + } + return $query; + } +} + + +class DB_Utils { + + /** @var \DB\SQL */ + protected $db; + + /** @var \BASE */ + protected $f3; + + const + TEXT_ENGINE_NOT_SUPPORTED = 'DB Engine `%s` is not supported for this action.'; + + /** + * parse command array and return backend specific query + * @param $cmd + * @param $cmd array + * @return bool|string + */ + protected function findQuery($cmd) + { + $match = FALSE; + foreach ($cmd as $backend => $val) + if (preg_match('/'.$backend.'/', $this->db->driver())) { + $match = TRUE; + break; + } + if (!$match) { + trigger_error(sprintf(self::TEXT_ENGINE_NOT_SUPPORTED, $this->db->driver())); + return FALSE; + } + return $val; + } + + public function __construct(SQL $db) { + $this->db = $db; + $this->f3 = \Base::instance(); + } +} \ No newline at end of file diff --git a/app/main/controller/AccessController.php b/app/main/controller/AccessController.php index f899568c..2d71f048 100644 --- a/app/main/controller/AccessController.php +++ b/app/main/controller/AccessController.php @@ -7,8 +7,7 @@ */ namespace Controller; - -use Model\User; +use Model; class AccessController extends Controller { @@ -21,19 +20,55 @@ class AccessController extends Controller { */ function beforeroute() { - parent::beforeroute(); + $isLoggedIn = $this->_isLoggedIn(); - if($this->isLoggedIn()){ + if($isLoggedIn){ $accessRoute = true; }else{ + $userName = 'abcdefghijklmnopqrst'; + $password = 'password'; + // try to verify user - $accessRoute = $this->verify('exodus 4d', 'test'); + $accessRoute = $this->_verifyUser($userName, $password); + + if(!$accessRoute){ + // add new User + try{ + $this->_registerUser($userName, $password); + }catch(\Exception\ValidationException $e){ + // registration failed + $this->f3->error($e->getCode(), $e->getMessage()); + } + } } - if(!$accessRoute){ + + if( + !$this->f3->get('AJAX') && + !$accessRoute + ){ $this->f3->reroute('/login'); } + parent::beforeroute(); + + } + + /** + * stores a new user in database + * @param $username + * @param $password + * @return null + */ + private function _registerUser($username, $password){ + + $user = Model\BasicModel::getNew('UserModel'); + + $user->name = $username; + $user->password = $user::generatePasswordHash($password); + $user->save(); + + return $user; } /** @@ -42,32 +77,19 @@ class AccessController extends Controller { * @param $password * @return bool */ - private function verify($userName, $password) { + private function _verifyUser($userName, $password) { $verify = false; - // check if user is already logged in - $isLoggedId = $this->isLoggedIn(); + $user = Model\BasicModel::getNew('UserModel'); - if($isLoggedId){ + $user->getByName($userName); + + $isValid = $user->verify($password); + + if($isValid === true){ + $this->_logIn($user); $verify = true; - }else{ - $user = new \Model\UserModel($this->f3->get('DB')); - - $auth = new \Auth($user, array('id' => 'name', 'pw' => 'password')); - $loginResult = $auth->login($userName, $password); - - if($loginResult){ - // login - - // two step user authentication - $user->getByAuth($userName, $password); - - if(! $user->dry()){ - $this->logIn($user); - $verify = true; - } - } } return $verify; @@ -77,7 +99,7 @@ class AccessController extends Controller { * checks weather a user is currently logged in * @return bool */ - private function isLoggedIn(){ + private function _isLoggedIn(){ $loggedIn = false; @@ -98,11 +120,11 @@ class AccessController extends Controller { }else{ // log out // get user model - $user = new \Model\UserModel($this->f3->get('DB')); + $user = Model\BasicModel::getNew('UserModel'); $user->getById($this->f3->get('SESSION.user.id')); if(! $user->dry()){ - $this->logOut($user); + $this->_logOut($user); } } } @@ -113,22 +135,36 @@ class AccessController extends Controller { /** * @param $user */ - private function logOut($user){ - $this->f3->clear('SESSION.user'); + private function _logOut($user){ + $this->f3->clear('SESSION'); } /** * log user in by mapper obj * @param $user */ - private function logIn($user){ + private function _logIn($user){ // user verified -> set Session login - new \DB\SQL\Session($this->f3->get('DB')); - $dateTime = new \DateTime(); $this->f3->set('SESSION.user.time', $dateTime->getTimestamp()); $this->f3->set('SESSION.user.name', $user->name); - $this->f3->set('SESSION.user.name', $user->name); + $this->f3->set('SESSION.user.id', $user->id); + } + + /** + * + * @return bool|null + */ + protected function _getUser(){ + + $user = Model\BasicModel::getNew('UserModel'); + $user->getById($this->f3->get('SESSION.user.id')); + + if($user->dry()){ + $user = false; + } + + return $user; } diff --git a/app/main/controller/Controller.php b/app/main/controller/Controller.php index 3b0cf846..c2450784 100644 --- a/app/main/controller/Controller.php +++ b/app/main/controller/Controller.php @@ -31,14 +31,16 @@ class Controller { $f3 = \Base::instance(); $this->f3 = $f3; + + // init DB + $this->setDB('PF'); } /** * event handler */ function beforeroute() { - // init DB - $this->setDB('PF'); + } /** @@ -51,6 +53,10 @@ class Controller { } } + /** + * set/change DB connection + * @param $type + */ protected function setDB($type){ if($type === 'CCP'){ @@ -70,7 +76,6 @@ class Controller { } $this->f3->set('DB', $db); - } diff --git a/app/main/controller/MapController.php b/app/main/controller/MapController.php index 865a7ec7..28bc92bd 100644 --- a/app/main/controller/MapController.php +++ b/app/main/controller/MapController.php @@ -8,14 +8,46 @@ namespace Controller; -class MapController extends AccessController { +class MapController extends Controller { function __construct() { parent::__construct(); } + public function showMap() { $this->setTemplate('templates/view/map.html'); } + + /** + * function is called on each error + * @param $f3 + */ + public function showError($f3){ + print_r($f3->get('ERROR')); + + // set HTTP status + if(!empty($f3->get('ERROR.code'))){ + $f3->status($f3->get('ERROR.code')); + } + + if($f3->get('AJAX')){ + header('Content-type: application/json'); + + // error on ajax call + $errorData = [ + 'status' => $f3->get('ERROR.status'), + 'code' => $f3->get('ERROR.code'), + 'text' => $f3->get('ERROR.text') + ]; + + echo json_encode($errorData); + }else{ + echo 'TODO: static errors'; + } + + die(); + } + } \ No newline at end of file diff --git a/app/main/controller/api/Map.php b/app/main/controller/api/Map.php new file mode 100644 index 00000000..ccc1b397 --- /dev/null +++ b/app/main/controller/api/Map.php @@ -0,0 +1,197 @@ +expire($expireTimeHead); + + $initData = []; + + // get all available map types ------------------------------------- + $mapType = Model\BasicModel::getNew('MapTypeModel'); + $rows = $mapType->find('active = 1', null, $expireTimeSQL); + + $mapTypeData = []; + foreach((array)$rows as $rowData){ + $data = [ + 'id' => $rowData->id, + 'label' => $rowData->label, + 'class' => $rowData->class, + 'classTab' => $rowData->classTab + ]; + $mapTypeData[$rowData->name] = $data; + + } + $initData['mapTypes'] = $mapTypeData; + + // get all available map scopes ------------------------------------ + $mapScope = Model\BasicModel::getNew('MapScopeModel'); + $rows = $mapScope->find('active = 1', null, $expireTimeSQL); + $mapScopeData = []; + foreach((array)$rows as $rowData){ + $data = [ + 'id' => $rowData->id, + 'label' => $rowData->label + ]; + $mapScopeData[$rowData->name] = $data; + } + $initData['mapScopes'] = $mapScopeData; + + // get all available system status ------------------------------------ + $systemStatus = Model\BasicModel::getNew('SystemStatusModel'); + $rows = $systemStatus->find('active = 1', null, $expireTimeSQL); + $systemScopeData = []; + foreach((array)$rows as $rowData){ + $data = [ + 'id' => $rowData->id, + 'label' => $rowData->label, + 'class' => $rowData->class + ]; + $systemScopeData[$rowData->name] = $data; + } + $initData['systemStatus'] = $systemScopeData; + + // get all available system types ------------------------------------- + $systemType = Model\BasicModel::getNew('SystemTypeModel'); + $rows = $systemType->find('active = 1', null, $expireTimeSQL); + $systemTypeData = []; + foreach((array)$rows as $rowData){ + $data = [ + 'id' => $rowData->id, + 'name' => $rowData->name + ]; + $systemTypeData[$rowData->name] = $data; + } + $initData['systemType'] = $systemTypeData; + + // get available connection scopes --------------------------------- + $connectionScope = Model\BasicModel::getNew('ConnectionScopeModel'); + $rows = $connectionScope->find('active = 1', null, $expireTimeSQL); + $connectionScopeData = []; + foreach((array)$rows as $rowData){ + $data = [ + 'id' => $rowData->id, + 'label' => $rowData->label + ]; + $connectionScopeData[$rowData->name] = $data; + } + $initData['connectionScopes'] = $connectionScopeData; + + echo json_encode($initData); + } + + /** + * update map data api + * function is called continuously + * @param $f3 + */ + public function updateData($f3){ + + $mapData = (array)$f3->get('POST.mapData'); + + $user = $this->_getUser(); + + $map = Model\BasicModel::getNew('MapModel'); + $system = Model\BasicModel::getNew('SystemModel'); + $connection = Model\BasicModel::getNew('ConnectionModel'); + + + + foreach($mapData as $data){ + + $config = $data['config']; + $systems = $data['data']['systems']; + $connections = $data['data']['connections']; + + // update map data --------------------------------------------- + $map->getById($config['id']); + + // update map on change + if( (int)$config['updated'] > strtotime($map->updated)){ + $map->setData($config); + $map->save(); + } + + // get system data ----------------------------------------------- + foreach($systems as $systemData){ + + $system->getById($systemData['id']); + + if((int)$systemData['updated'] > strtotime($system->updated)){ + $systemData['mapId'] = $map; + $system->setData($systemData); + $system->save(); + } + + $system->reset(); + } + + // get connection data ------------------------------------------- + foreach($connections as $connectionData){ + + $connection->getById($connectionData['id']); + + if((int)$connectionData['updated'] > strtotime($connection->updated)){ + + $connectionData['mapId'] = $map; + $connection->setData($connectionData); + $connection->save(); + } + $connection->reset(); + } + + $map->reset(); + } + + // get map data ====================================================== + + $activeMaps = $user->getMaps(); + + $newData = []; + foreach($activeMaps as $activeMap){ + + $newData[] = [ + 'config' => $activeMap->getData(), + 'data' => [ + 'systems' => $activeMap->getSystemData(), + 'connections' => $activeMap->getConnectionData(), + ] + ]; + } + + + + + echo json_encode($newData); + } + +} \ No newline at end of file diff --git a/app/main/controller/api/Systems.php b/app/main/controller/api/System.php similarity index 89% rename from app/main/controller/api/Systems.php rename to app/main/controller/api/System.php index b4b8e287..9dc780d9 100644 --- a/app/main/controller/api/Systems.php +++ b/app/main/controller/api/System.php @@ -8,8 +8,9 @@ namespace Controller\Api; use Data\Mapper as Mapper; +use Model; -class Systems extends \Controller\AccessController { +class System extends \Controller\AccessController { private $mainQuery = "SELECT map_sys.constellationID connstallation_id, @@ -87,7 +88,12 @@ class Systems extends \Controller\AccessController { return $query; } - public function getDataById($f3, $params){ + /** + * get system data by systemId + * @param $f3 + * @param $params + */ + public function getById($f3, $params){ // switch DB $this->setDB('CCP'); @@ -110,7 +116,15 @@ class Systems extends \Controller\AccessController { // format result $mapper = new Mapper\CcpSystemsMapper($rows); - $data = $mapper->getData(); + $ccpData = $mapper->getData(); + + // switch DB + $this->setDB('PF'); + + $system = Model\BasicModel::getNew('SystemModel'); + $system->setData(reset($ccpData)); + + $data = $system->getData(); echo json_encode($data); } diff --git a/app/main/data/mapper/CcpSystemsMapper.php b/app/main/data/mapper/CcpSystemsMapper.php index 6e194c6d..de565d78 100644 --- a/app/main/data/mapper/CcpSystemsMapper.php +++ b/app/main/data/mapper/CcpSystemsMapper.php @@ -57,16 +57,23 @@ class CcpSystemsMapper extends \RecursiveArrayIterator { // format functions self::$map['type'] = function($iterator){ + // TODO refactore $type = 'wh'; + $typeId = 1; if( $iterator['security'] == 7 || $iterator['security'] == 8 || $iterator['security'] == 9 ){ $type = 'k-space'; + $typeId = 2; + } - return $type; + return [ + 'id' => $typeId, + 'name' => $type + ]; }; iterator_apply($this, 'self::recursiveIterator', array($this)); @@ -92,8 +99,6 @@ class CcpSystemsMapper extends \RecursiveArrayIterator { // check for mapping key if(array_key_exists($iterator->key(), self::$map)){ - $removeOldEntry = false; - if(is_array(self::$map[$iterator->key()])){ // a -> array mapping diff --git a/app/main/exception/BaseException.php b/app/main/exception/BaseException.php new file mode 100644 index 00000000..95ea5fbb --- /dev/null +++ b/app/main/exception/BaseException.php @@ -0,0 +1,21 @@ +_validateField($col, $val); + + if(!$valid){ + throw new Exception\ValidationException('Field validation: "' . $this->table . '->' . $col . '" not valid', Exception\BaseException::VALIDATION_FAILED); + }else{ + parent::__set($col, $val); + } + } + + /** + * validates a table column based on validation settings + * @param $col + * @param $val + * @return bool + */ + private function _validateField($col, $val){ + $valid = true; + + if(array_key_exists($col, $this->validate)){ + + $fieldValidationOptions = $this->validate[$col]; + + foreach($fieldValidationOptions as $validateKey => $validateOption ){ + if(is_array($fieldValidationOptions[$validateKey])){ + $fieldSubValidationOptions = $fieldValidationOptions[$validateKey]; + + foreach($fieldSubValidationOptions as $validateSubKey => $validateSubOption ){ + switch($validateKey){ + case 'length': + switch($validateSubKey){ + case 'min'; + if(strlen($val) < $validateSubOption){ + $valid = false; + } + break; + case 'max'; + + if(strlen($val) > $validateSubOption){ + $valid = false; + } + break; + } + + break; + } + } + + }else{ + switch($validateKey){ + case 'regex': + $valid = (bool)preg_match($fieldValidationOptions[$validateKey], $val); + break; + } + } + + // a validation rule failed + if(!$valid){ + break; + } + + } + } + + return $valid; + } + + + /** + * get single dataSet by id + * @param $id + * @return array|FALSE + */ + public function getById($id) { + return $this->getByForeignKey('id', (int)$id, array('limit' => 1)); + } + + /** + * get dataSet by foreign column + * @param $key + * @param $id + * @param $options + * @return array|FALSE + */ + public function getByForeignKey($key, $id, $options = array()){ + + $querySet = []; + $query = []; + if($this->exists($key)){ + $query[] = $key . " = :" . $key; + $querySet[':' . $key] = $id; + } + + // check active column + if($this->exists('active')){ + $query[] = "active = :active"; + $querySet[':active'] = 1; + } + + array_unshift($querySet, implode(' AND ', $query)); + + return $this->load( $querySet, $options ); + } + + /** + * get multiple model obj that have an 1->m relation to this model + * @param $model + * @param $foreignKey + * @return mixed + */ + public function getRelatedModels($model, $foreignKey){ + $model = self::getNew($model); + $relatedModels = $model->find(array($foreignKey . ' = ? AND active = 1', $this->id), null, 10); + + return $relatedModels; + } + + /** + * factory for all Models + * @param $model + * @return null + * @throws \Exception + */ + public static function getNew($model){ + $class = null; + + $model = '\\' . __NAMESPACE__ . '\\' . $model; + if(class_exists($model)){ + $class = new $model(); + }else{ + throw new \Exception('No model class found'); + } + + return $class; + } + +} \ No newline at end of file diff --git a/app/main/model/ConnectionModel.php b/app/main/model/ConnectionModel.php new file mode 100644 index 00000000..80d62f2e --- /dev/null +++ b/app/main/model/ConnectionModel.php @@ -0,0 +1,58 @@ + array( + 'belongs-to-one' => 'Model\MapModel' + ), + 'type' => array( + 'type' => self::DT_JSON + ) + ); + + /** + * set an array with all data for a system + * @param $systemData + */ + public function setData($systemData){ + + foreach((array)$systemData as $key => $value){ + + if(!is_array($value)){ + if($this->exists($key)){ + $this->$key = $value; + } + }elseif($key == 'type'){ + // json field + $this->$key = $value; + } + } + } + + public function getData(){ + + $connectionData = [ + 'id' => $this->id, + 'source' => $this->source, + 'target' => $this->target, + 'scope' => $this->scope, + 'type' => $this->type, + 'updated' => strtotime($this->updated) + ]; + + return $connectionData; + } + +} \ No newline at end of file diff --git a/app/main/model/ConnectionScopeModel.php b/app/main/model/ConnectionScopeModel.php new file mode 100644 index 00000000..303ee103 --- /dev/null +++ b/app/main/model/ConnectionScopeModel.php @@ -0,0 +1,16 @@ + array( + 'belongs-to-one' => 'Model\MapScopeModel' + ), + 'typeId' => array( + 'belongs-to-one' => 'Model\MapTypeModel' + ) + ); + + protected $validate = [ + 'name' => [ + 'length' => [ + 'min' => 3 + ] + ], + 'icon' => [ + 'length' => [ + 'min' => 3 + ] + ], + 'scopeId' => [ + 'regex' => '/^[1-9]+$/' + ], + 'typeId' => [ + 'regex' => '/^[1-9]+$/' + ], + ]; + + public function setData($data){ + + foreach((array)$data as $key => $value){ + + if(!is_array($value)){ + if($this->exists($key)){ + $this->$key = $value; + } + }else{ + // special array data + if($key == 'scope'){ + $this->scopeId = $value['id']; + }elseif($key == 'type'){ + $this->typeId = $value['id']; + } + } + } + } + + + /** + * get map data for for response + * @return array + */ + public function getData(){ + + $mapData = [ + 'id' => $this->id, + 'name' => $this->name, + 'scope' => [ + 'id' => $this->scopeId->id, + 'name' => $this->scopeId->name, + 'label' => $this->scopeId->label + ], + 'type' => [ + 'id' => $this->typeId->id, + 'name' => $this->typeId->name + ], + 'icon' => $this->icon, + 'updated' => strtotime($this->updated) + + + ]; + + return $mapData; + } + + /** + * get all system data for all systems in this map + * @return array + */ + public function getSystemData(){ + $systems = $this->getRelatedModels('SystemModel', 'mapId'); + + $systemData = []; + foreach($systems as $system){ + $systemData[] = $system->getData(); + } + + return $systemData; + } + + /** + * get all connection data in this map + * @return array + */ + public function getConnectionData(){ + $connections = $this->getRelatedModels('ConnectionModel', 'mapId'); + + $connectionData = []; + foreach($connections as $connection){ + $connectionData[] = $connection->getData(); + } + + return $connectionData; + } + + + +} \ No newline at end of file diff --git a/app/main/model/MapScopeModel.php b/app/main/model/MapScopeModel.php new file mode 100644 index 00000000..8ff84723 --- /dev/null +++ b/app/main/model/MapScopeModel.php @@ -0,0 +1,16 @@ + array( + 'belongs-to-one' => 'Model\MapModel' + ), + 'typeId' => array( + 'belongs-to-one' => 'Model\SystemTypeModel' + ), + 'statusId' => array( + 'belongs-to-one' => 'Model\SystemStatusModel' + ) + ); + + /** + * set an array with all data for a system + * @param $systemData + */ + public function setData($systemData){ + + foreach((array)$systemData as $key => $value){ + + if(!is_array($value)){ + if($this->exists($key)){ + $this->$key = $value; + } + }else{ + // special array data + if($key == 'type'){ + $this->typeId = $value['id']; + }elseif($key == 'constellation'){ + $this->constellationId = $value['id']; + $this->constellation = $value['name']; + }elseif($key == 'region'){ + $this->regionId = $value['id']; + $this->region = $value['name']; + }elseif($key == 'type'){ + $this->typeId = $value['id']; + }elseif($key == 'status'){ + $this->statusId = $value['id']; + }elseif($key == 'position'){ + $this->posX = $value['x']; + $this->posY = $value['y']; + } + } + } + } + + /** + * get map data for for response + * @return array + */ + public function getData(){ + + $systemData = [ + 'id' => $this->id, + 'mapId' => is_object($this->mapId) ? $this->mapId->id : 0, + 'systemId' => $this->systemId, + 'name' => $this->name, + 'alias' => $this->alias, + 'effect' => $this->effect, + 'security' => $this->security, + 'trueSec' => $this->trueSec, + 'region' => [ + 'id' => $this->regionId, + 'name' => $this->region + ], + 'constellation' => [ + 'id' => $this->constellationId, + 'name' => $this->constellation + ], + 'type' => [ + 'id' => $this->typeId->id, + 'name' => $this->typeId->name + ], + 'status' => [ + 'id' => is_object($this->statusId) ? $this->statusId->id : 0, + 'name' => is_object($this->statusId) ? $this->statusId->name : '' + ], + 'locked' => $this->locked, + 'rally' => $this->rally, + 'position' => [ + 'x' => $this->posX, + 'y' => $this->posY + ], + 'updated' => strtotime($this->updated) + + ]; + + + return $systemData; + } + +} \ No newline at end of file diff --git a/app/main/model/SystemStatusModel.php b/app/main/model/SystemStatusModel.php new file mode 100644 index 00000000..dfebf3b7 --- /dev/null +++ b/app/main/model/SystemStatusModel.php @@ -0,0 +1,15 @@ + array( + 'belongs-to-one' => 'Model\MapModel' + ) + ); + + + +} \ No newline at end of file diff --git a/app/main/model/UserModel.php b/app/main/model/UserModel.php index 5679a6ef..ba569def 100644 --- a/app/main/model/UserModel.php +++ b/app/main/model/UserModel.php @@ -8,19 +8,75 @@ namespace Model; -class UserModel extends \DB\SQL\Mapper { +class UserModel extends BasicModel { - private $tableName = 'user'; + protected $table = 'user'; - function __construct(\DB\SQL $db) { - parent::__construct($db, $this->tableName); + protected $validate = [ + 'name' => [ + 'length' => [ + 'min' => 5, + 'max' => 20 + ], + 'regex' => '/^[ \w-_]+$/' + ], + 'password' => [ + 'length' => [ + 'min' => 5, + 'max' => 255 + ] + ] + ]; + + /** + * generate password hash + * @param $password + * @return FALSE|string + */ + public static function generatePasswordHash($password){ + // generate random id (23 chars) + $salt = uniqid('', true); + return \Bcrypt::instance()->hash($password, $salt); } - public function getById($id) { - return $this->load( array('id=?', $id) ); + /** + * search for user by unique username + * @param $name + * @return array|FALSE + */ + public function getByName($name){ + return $this->getByForeignKey('name', $name); } - public function getByAuth($name, $password){ - return $this->load( array('name=? AND password=?', $name, $password) ); + /** + * verify a user by his wassword + * @param $password + * @return bool + */ + public function verify($password){ + $valid = false; + + if(! $this->dry()){ + $valid = (bool) \Bcrypt::instance()->verify($password, $this->password); + } + + return $valid; } + + /** + * get all assessable map models for a single user + * @return array + */ + public function getMaps(){ + $userMaps = $this->getRelatedModels('UserMapModel', 'userId'); + + $maps = []; + foreach($userMaps as $userMap){ + $maps[] = $userMap->mapId; + } + + return $maps; + } + + } \ No newline at end of file diff --git a/app/routes.cfg b/app/routes.cfg index 962eadfe..c2bc0f83 100644 --- a/app/routes.cfg +++ b/app/routes.cfg @@ -5,5 +5,5 @@ GET|POST /= Controller\MapController->showMap GET|POST /login= Controller\Controller->showLogin ; api routes -GET /api/@controller/@action = Controller\Api\@controller->@action -GET /api/@controller/@action/@arg1 = Controller\Api\@controller->@action \ No newline at end of file +GET|POST /api/@controller/@action = Controller\Api\@controller->@action +GET|POST /api/@controller/@action/@arg1 = Controller\Api\@controller->@action \ No newline at end of file diff --git a/index.php b/index.php index 8b6e3280..4eb322f5 100644 --- a/index.php +++ b/index.php @@ -2,6 +2,9 @@ $f3 = require('app/lib/base.php'); +// sync program with eve server time +date_default_timezone_set('UTC'); + // load configuration $f3->config('app/config.cfg'); diff --git a/js/app.js b/js/app.js index 161b7fe1..6bcad09e 100644 --- a/js/app.js +++ b/js/app.js @@ -27,6 +27,7 @@ requirejs.config({ hoverIntent: 'lib/jquery.hoverIntent.minified', // v1.8.0 Hover intention - http://cherne.net/brian/resources/jquery.hoverIntent.html fullScreen: 'lib/jquery.fullscreen.min', // v0.5.0 Full screen mode - https://github.com/private-face/jquery.fullscreen select2: 'lib/select2.min', // v4.0.0 Drop Down customization - https://select2.github.io/ + validator: 'lib/validator.min', // v0.7.2 Validator for Bootstrap 3 - https://github.com/1000hz/bootstrap-validator pnotify: 'lib/pnotify/pnotify.core', // v2.0.1 PNotify - notification core file @@ -93,6 +94,9 @@ requirejs.config({ select2: { deps : ['jquery'], exports: 'Select2' + }, + validator: { + deps : ['jquery', 'bootstrap'] } } }); diff --git a/js/app/init.js b/js/app/init.js index 020a4741..404056a8 100644 --- a/js/app/init.js +++ b/js/app/init.js @@ -22,8 +22,10 @@ define(['jquery'], function($) { }, path: { img: 'public/img/', // path for images - searchSystems: 'api/systems/search', // ajax path - search system by name - getSystem: 'api/systems/getDataById' // ajax path - get system by id + searchSystems: 'api/system/search', // ajax URL - search system by name + getSystem: 'api/system/getById', // ajax URL - get system by id + initMap: 'api/map/init', // ajax URL - get static data + updateMapData: 'api/map/updateData' // ajax URL - main map update call }, url: { zKillboard: 'https://zkillboard.com/api/', // killboard api @@ -49,29 +51,6 @@ define(['jquery'], function($) { label: 'error' } }, - // map types - mapTypes: { - standard: { - class: '', - classTab: 'pf-map-type-tab-default', - label: '' - }, - private: { - class: 'pf-map-type-private', - classTab: 'pf-map-type-tab-private', - label: 'Private' - }, - alliance: { - class: 'pf-map-type-alliance', - classTab: 'pf-map-type-tab-alliance', - label: 'Alliance' - }, - global: { - class: 'pf-map-type-global', - classTab: 'pf-map-type-tab-global', - label: 'Global' - } - }, // system effects systemEffects: { @@ -173,33 +152,6 @@ define(['jquery'], function($) { class: 'pf-system-security-1-0' } }, - // system status - systemStatus: { - unknown: { - class: 'pf-system-status-unknown', - label: 'unknown' - }, - friendly: { - class: 'pf-system-status-friendly', - label: 'friendly' - }, - occupied: { - class: 'pf-system-status-occupied', - label: 'occupied' - }, - hostile: { - class: 'pf-system-status-hostile', - label: 'hostile' - }, - empty: { - class: 'pf-system-status-empty', - label: 'empty' - }, - unscanned: { - class: 'pf-system-status-unscanned', - label: 'unscanned' - } - }, // system info systemInfo: { rally: { @@ -215,17 +167,6 @@ define(['jquery'], function($) { }, // map scopes defaultMapScope: 'wh', // default scope for connection - mapScopes: { // available scopes for a connection - wh: { - label: 'wormhole' - }, - stargate: { - label: 'stargate' - }, - jumpbridge: { - label: 'jumpbridge' - } - }, // map connection types connectionTypes: { jumpbridge: { diff --git a/js/app/main.js b/js/app/main.js index 389c499d..6efdbe62 100644 --- a/js/app/main.js +++ b/js/app/main.js @@ -37,9 +37,18 @@ define([ config: { id: 99, name: 'Polaris', - scope: 'wormhole', + scope: { + id: 1, + name: 'wh', + label: 'w-space' + }, icon: 'fa-globe', - type: 'alliance' // global, alliance, private + type: { + id: 1, + name: 'alliance', + label: 'Alliance' + }, + updated: 1424545904 }, data: { systems: [ @@ -49,12 +58,26 @@ define([ name: 'J150020', alias: 'Polaris', effect: 'magnetar', - type: 'wh', + type: { + id: 1, + name: 'wh' + }, security: 'C6', trueSec: -1, - status: 'friendly', - locked: '1', - rally: '0', + region: { + id: '11000030', + name: 'F-R00030' + }, + constellation: { + id: '21000298', + name: 'F-C00298' + }, + status: { + id: 2, + name: 'friendly' + }, + locked: 1, + rally: 0, position: { x: 8, y: 300 @@ -66,10 +89,24 @@ define([ name: 'J115844', alias: '', effect: 'wolfRyet', - type: 'wh', + type: { + id: 1, + name: 'wh' + }, security: 'C6', trueSec: -1, - status: 'empty', + region: { + id: '11000030', + name: 'F-R00030' + }, + constellation: { + id: '21000298', + name: 'F-C00298' + }, + status: { + id: 5, + name: 'empty' + }, position: { x: 25, y: 40 @@ -82,10 +119,24 @@ define([ name: 'J155207', alias: '', effect: 'wolfRyet', - type: 'wh', + type: { + id: 1, + name: 'wh' + }, security: 'C6', trueSec: -1, - status: '', + region: { + id: '11000030', + name: 'F-R00030' + }, + constellation: { + id: '21000301', + name: 'F-C00301' + }, + status: { + id: 1, + name: 'unknown' + }, locked: '1', rally: '1', position: { @@ -101,8 +152,22 @@ define([ effect: 'pulsar', security: 'C3', trueSec: -1, - type: 'wh', - status: 'hostile', + region: { + id: '11000030', + name: 'F-R00030' + }, + constellation: { + id: '21000303', + name: 'F-C00303' + }, + type: { + id: 1, + name: 'wh' + }, + status: { + id: 4, + name: 'hostile' + }, position: { x: 40, y: 160 @@ -117,15 +182,21 @@ define([ security: 'L', trueSec: 0.3, region: { - id: '10000036', + id: 10000036, name: 'Devoid' }, constellation: { - id: '20000436', + id: 20000436, name: 'Jayai' }, - type: 'k-space', - status: '', + type: { + id: 2, + name: 'k-space' + }, + status: { + id: 1, + name: 'unknown' + }, position: { x: 280, y: 250 @@ -140,15 +211,21 @@ define([ security: 'H', trueSec: 0.9, region: { - id: '10000002', + id: 10000002, name: 'The Forge' }, constellation: { - id: '20000020', + id: 20000020, name: 'Kimotoro' }, - type: 'k-space', - status: '', + type: { + id: 2, + name: 'k-space' + }, + status: { + id: 1, + name: 'unknown' + }, position: { x: 400, y: 150 @@ -163,15 +240,21 @@ define([ security: 'C1', trueSec: -1, region: { - id: '11000002', + id: 11000002, name: 'A-R00002' }, constellation: { - id: '21000002', + id: 21000002, name: 'A-C00002' }, - type: 'wh', - status: 'occupied', + type: { + id: 1, + name: 'wh' + }, + status: { + id: 3, + name: 'occupied' + }, position: { x: 600, y: 75 @@ -186,15 +269,21 @@ define([ security: 'H', trueSec: 0.9, region: { - id: '10000002', + id: 10000002, name: 'The Forge' }, constellation: { id: '20000020', name: 'Kimotoro' }, - type: 'k-space', - status: 'unscanned', + type: { + id: 2, + name: 'k-space' + }, + status: { + id: 6, + name: 'unscanned' + }, position: { x: 550, y: 200 @@ -209,15 +298,21 @@ define([ security: '0.0', trueSec: -0.1, region: { - id: '10000012', + id: 10000012, name: 'Curse' }, constellation: { id: '20000150', name: 'Sound' }, - type: 'k-space', - status: '', + type: { + id: 2, + name: 'k-space' + }, + status: { + id: 1, + name: 'unknown' + }, position: { x: 500, y: 300 @@ -316,46 +411,85 @@ define([ config: { name: 'Providence', id: 2, - scope: 'wormhole', + scope: { + id: 1, + name: 'wh', + label: 'w-space' + }, icon: 'fa-bookmark', - type: 'global' + type: { + id: 3, + name: 'global', + label: 'global' + }, + updated: 1424545903 }, data: { systems: [ { - id: 50, - systemId: 31002378, - name: 'J150020', + id: 755, + systemId: 30000144, + name: 'Perimeter', alias: '', - effect: 'magnetar', - security: 'C6', - type: 'wh', - status: 'friendly', + effect: '', + security: 'H', + trueSec: 0.9, + region: { + id: 10000002, + name: 'The Forge' + }, + constellation: { + id: '20000020', + name: 'Kimotoro' + }, + type: { + id: 2, + name: 'k-space' + }, + status: { + id: 6, + name: 'unscanned' + }, position: { - x: 5, + x: 550, y: 200 }, updated: 1420903681 },{ - id: 51, - systemId: 31002375, - name: 'J115844', + id: 8555, + systemId: 30001028, + name: 'RMOC-W', alias: '', - effect: 'wolfRyet', - security: 'C6', - type: 'wh', - status: 'empty', + effect: '', + security: '0.0', + trueSec: -0.1, + region: { + id: 10000012, + name: 'Curse' + }, + constellation: { + id: '20000150', + name: 'Sound' + }, + type: { + id: 2, + name: 'k-space' + }, + status: { + id: 1, + name: 'unknown' + }, position: { - x: 60, - y: 65 + x: 500, + y: 300 }, updated: 1420903681 } ], connections: [{ id: 23, - source: 50, - target: 51, + source: 755, + target: 8555, type: [ 'wh_fresh' ], @@ -368,9 +502,18 @@ define([ config: { name: 'Exodus 4D', id: 3, - scope: 'wormhole', + scope: { + id: 1, + name: 'wh', + label: 'w-space' + }, icon: 'fa-sitemap', - type: 'private' + type: { + id: 2, + name: 'private', + label: 'private' + }, + updated: 1424545903 }, data: { systems: [], @@ -472,8 +615,34 @@ define([ var mapModule = $(this); - var mapDataUpdateActive = true; // allow update "map data" - var userDataUpdateActive = true; // allow update "user data" + // map init load static data ================================== + $.getJSON( Init.path.initMap, function( initData ) { + + Init.mapTypes = initData.mapTypes; + Init.mapScopes = initData.mapScopes; + Init.connectionScopes = initData.connectionScopes; + Init.systemStatus = initData.systemStatus; + Init.systemType = initData.systemType; + + console.log(Init.systemType); + // init map module + mapModule.initMapModule(); + + }).fail(function( jqXHR, status, error) { + var reason = status + ' ' + jqXHR.status + ': ' + error; + Util.emergencyShutdown(reason); + }); + + }); + + + + + + + $.fn.initMapModule = function(){ + + var mapModule = $(this); var mapUpdateKey = 'mapUpdate'; var mapUpdateDelay = Init.timer[mapUpdateKey].delay; @@ -506,17 +675,36 @@ define([ // get updated map data Util.timeStart(mapModuleDatakey); - var newMapData = mapModule.getMapModuleData(); + var updatedMapData = mapModule.getMapModuleData(); var mapDataLogDuration = Util.timeStop(mapModuleDatakey); -console.log(newMapData) + // log execution time Util.log(mapModuleDatakey, {duration: mapDataLogDuration, description: 'getMapModuleData'}); - // - setTimeout(function(){ - triggerMapUpdatePing(mapData); - }, mapUpdateDelay); + // wrap array to object + updatedMapData = {mapData: updatedMapData}; + // store updatedMapData + $.ajax({ + type: 'POST', + url: Init.path.updateMapData, + data: updatedMapData, + dataType: 'json' + }).done(function(data){ + + mapData = data; + + // init new trigger + setTimeout(function(){ + triggerMapUpdatePing(mapData); + }, mapUpdateDelay); + + }).fail(function( jqXHR, status, error) { + var reason = status + ': ' + error; + console.log(error); + Util.showNotify({title: jqXHR.status + ': updatedMapData', text: reason, type: 'warning'}); + $(document).setProgramStatus('problem'); + }); }; triggerMapUpdatePing(mapData); @@ -524,29 +712,28 @@ console.log(newMapData) // ping for user data update ------------------------------------------------------- var triggerUserUpdatePing = function(userData){ - // prevent multiple requests simultaneously - if(userDataUpdateActive === true){ - $(document).setProgramStatus('online'); + $(document).setProgramStatus('online'); - userDataUpdateActive = false; + Util.timeStart(mapUserUpdateKey); + mapModule.updateMapModuleData(userData); + var duration = Util.timeStop(mapUserUpdateKey); - Util.timeStart(mapUserUpdateKey); - userDataUpdateActive = mapModule.updateMapModuleData(userData); - var duration = Util.timeStop(mapUserUpdateKey); - - // log execution time - Util.log(mapUserUpdateKey, {duration: duration, description:'updateMapModuleData'}); - - - }else{ - // not finished in time -> to slow or error - $(document).setProgramStatus('problem'); - } + // log execution time + Util.log(mapUserUpdateKey, {duration: duration, description:'updateMapModuleData'}); + // init new trigger + setTimeout(function(){ + triggerUserUpdatePing(tempUserData); + }, mapUserUpdateDelay); }; - setInterval(triggerUserUpdatePing, mapUserUpdateDelay, tempUserData); - }); + // start user update trigger after map loaded + setTimeout(function(){ + triggerUserUpdatePing(tempUserData); + }, 2000); + + }; + }); diff --git a/js/app/map/map.js b/js/app/map/map.js index 8f37fe0f..84f06d4e 100644 --- a/js/app/map/map.js +++ b/js/app/map/map.js @@ -5,6 +5,7 @@ define([ 'app/render', 'bootbox', 'app/ccp', + 'validator', 'jsPlumb', 'customScrollbar', 'dragToSelect', @@ -19,6 +20,7 @@ define([ // TODO: remove temp ID counter tempId: 100, zIndexCounter: 110, + logTimerCount: 3, // map log timer in seconds newSystemOffset: { x: 150, y: 0 @@ -58,7 +60,8 @@ define([ systemContextMenuId: 'pf-map-system-contextmenu', // dialogs - systemDialogId: 'pf-system-dialog', + systemDialogId: 'pf-system-dialog', // id for system dialog + systemDialogSelectClass: 'pf-system-dialog-select', // id for system select Element // system security classes systemSec: 'pf-system-sec', @@ -470,19 +473,18 @@ define([ $.fn.setSystemStatus = function(status){ var system = $(this); + var statusId = Util.getStatusInfoForSystem(status, 'id'); var statusClass = Util.getStatusInfoForSystem(status, 'class'); - var statusLabel = Util.getStatusInfoForSystem(status, 'label'); - for(var property in Init.classes.systemStatus) { - if (Init.classes.systemStatus.hasOwnProperty(property)) { - system.removeClass( Init.classes.systemStatus[property].class ); + for(var property in Init.systemStatus) { + if (Init.systemStatus.hasOwnProperty(property)) { + system.removeClass( Init.systemStatus[property].class ); } } // add new class - system.data('status', statusLabel); + system.data('statusId', statusId); system.addClass( statusClass ); - }; /** @@ -574,14 +576,20 @@ define([ system.find('.' + config.systemHeadNameClass).attr('data-value', systemName); // set system status - system.setSystemStatus(data.status); + system.setSystemStatus(data.status.name); system.data('id', parseInt(data.id)); system.data('systemId', parseInt(data.systemId)); system.data('name', data.name); - system.data('type', data.type); + system.data('typeId', data.type.id); system.data('effect', data.effect); + system.data('security', data.security); system.data('trueSec', parseFloat(data.trueSec)); + system.data('regionId', parseInt(data.region.id)); + system.data('region', data.region.name); + system.data('constellationId', parseInt(data.constellation.id)); + system.data('constellation', data.constellation.name); + system.data('updated', data.updated); system.attr('data-mapid', mapContainer.data('id')); @@ -644,9 +652,10 @@ define([ // add additional information mapContainer.data('name', mapConfig.config.name); - mapContainer.data('scope', mapConfig.config.scope); + mapContainer.data('scopeId', mapConfig.config.scope.id); + mapContainer.data('typeId', mapConfig.config.type.id); mapContainer.data('icon', mapConfig.config.icon); - mapContainer.data('type', mapConfig.config.type); + mapContainer.data('updated', mapConfig.config.updated); // get map data var mapData = mapContainer.getMapData(); @@ -1090,7 +1099,7 @@ define([ var mapOverlay = $(this); var counterChart = mapOverlay.getMapCounter(); - var seconds = 10; + var seconds = config.logTimerCount; var fadeEffectDuration = 200; // get counter interval (in case there is an active one) @@ -1214,7 +1223,7 @@ define([ // connection have the default map Scope scope var scope = map.Defaults.Scope; if(connectionData.scope){ - scope = connectionData.scope; + scope = connectionData.scope.name; } var connection = map.connect({ @@ -1222,7 +1231,8 @@ define([ target: config.systemIdPrefix + mapId + '-' + connectionData.target, scope: scope, parameters: { - connectionId: connectionId + connectionId: connectionId, + updated: connectionData.updated } /* experimental (straight connections) anchors: [ @@ -1435,7 +1445,7 @@ define([ var initSystemContextMenu = function(){ var systemStatus = []; - $.each(Init.classes.systemStatus, function(status, statusData){ + $.each(Init.systemStatus, function(status, statusData){ var tempStatus = { subIcon: 'fa-circle', subIconClass: statusData.class, @@ -2307,7 +2317,7 @@ define([ case 'scope_jumpbridge': var newScope = action.split('_')[1]; - var newScopeName = Util.getScopeInfoForMap( newScope, 'label'); + var newScopeName = Util.getScopeInfoForConnection( newScope, 'label'); bootbox.confirm('Change scope from ' + activeScopeName + ' to ' + newScopeName + '?', function(result) { if(result){ @@ -2392,7 +2402,7 @@ define([ // format system status for form select var systemStatus = {}; - $.each(Init.classes.systemStatus, function(status, statusData){ + $.each(Init.systemStatus, function(status, statusData){ //statusData.status = status; //systemStatus.push(statusData); systemStatus[status] = statusData.label; @@ -2401,8 +2411,8 @@ define([ var data = { id: config.systemDialogId, - system: 'lalala', - status: systemStatus + status: systemStatus, + selectClass: config.systemDialogSelectClass }; requirejs(['text!templates/modules/system_dialog.html', 'mustache'], function(template, Mustache) { @@ -2424,72 +2434,79 @@ define([ } }, success: { - label: 'Add system', + label: ' add system', className: 'btn-primary', - callback: function () { + callback: function (e) { // get form Values var form = $('#' + config.systemDialogId).find('form'); var systemDialogData = $(form).getFormValues(); + // validate form + form.validator('validate'); + + // check weather the form is valid + var formValid = form.isValidForm(); + + if(formValid === false){ + // don't close dialog + return false; + + } + // get system information var requestUrl = Init.path.getSystem + '/' + parseInt( systemDialogData.systemId ); $.getJSON( requestUrl, function( systemData ) { - if(systemData.length === 1){ + mapContainer.getMapOverlay().startMapUpdateCounter(); - mapContainer.getMapOverlay().startMapUpdateCounter(); + // merge dialog data and backend data + var newSystemData = $.extend(systemData, systemDialogData); - systemData = systemData.shift(); + var currentX = 0; + var currentY = 0; - // merge dialog data and backend data - var newSystemData = $.extend(systemData, systemDialogData); + var newPositon = { + x: 0, + y: 0 + }; - var currentX = 0; - var currentY = 0; + var sourceSystem = null; - var newPositon = { - x: 0, - y: 0 + // add new position + if(options.sourceSystem !== undefined){ + + sourceSystem = options.sourceSystem; + + // related system is available + currentX = sourceSystem.css('left'); + currentY = sourceSystem.css('top'); + + // remove "px" + currentX = parseInt( currentX.substring(0, currentX.length - 2) ); + currentY = parseInt( currentY.substring(0, currentY.length - 2) ); + + newPositon = { + x: currentX + config.newSystemOffset.x, + y: currentY + config.newSystemOffset.y + }; + }else{ + // check mouse cursor position (add system to map) + newPositon = { + x: options.position.x, + y: options.position.y }; - - var sourceSystem = null; - - // add new position - if(options.sourceSystem !== undefined){ - - sourceSystem = options.sourceSystem; - - // related system is available - currentX = sourceSystem.css('left'); - currentY = sourceSystem.css('top'); - - // remove "px" - currentX = parseInt( currentX.substring(0, currentX.length - 2) ); - currentY = parseInt( currentY.substring(0, currentY.length - 2) ); - - newPositon = { - x: currentX + config.newSystemOffset.x, - y: currentY + config.newSystemOffset.y - }; - }else{ - // check mouse cursor position (add system to map) - newPositon = { - x: options.position.x, - y: options.position.y - }; - } - - newSystemData.position = newPositon; - - // draw new system to map - drawSystem(map, newSystemData, sourceSystem); - } + + newSystemData.position = newPositon; + + // draw new system to map + drawSystem(map, newSystemData, sourceSystem); + + }).fail(function( jqXHR, status, error) { var reason = status + ': ' + error; Util.showNotify({title: jqXHR.status + ': System search failed', text: reason, type: 'warning'}); - }); } @@ -2497,12 +2514,14 @@ define([ } }); - // init dialog systemDialog.on('shown.bs.modal', function(e) { + var modalContent = $('#' + config.systemDialogId); + // init system select live search - var selectElement = $(".js-example-basic-single"); + var selectElement = modalContent.find('.' + config.systemDialogSelectClass); + $.when( selectElement.select2({ ajax: { @@ -2542,11 +2561,12 @@ define([ } }, minimumInputLength: 2, - placeholder: 'Name', + placeholder: 'Jita', allowClear: true }) ).done(function(){ - $('#testId').css({'display': 'block'}); + // open select + selectElement.select2('open'); }); }); @@ -2561,7 +2581,8 @@ define([ emptytext: 'unknown', onblur: 'submit', showbuttons: false, - source: systemStatus + source: systemStatus, + inputclass: config.systemDialogSelectClass }); }); @@ -2674,11 +2695,16 @@ define([ ){ // map config --------------------------------- var mapConfig = {}; - mapConfig.id = mapElement.data('id'); + mapConfig.id = parseInt( mapElement.data('id') ); mapConfig.name = mapElement.data('name'); - mapConfig.scope = mapElement.data('scope'); + mapConfig.scope = { + id: parseInt( mapElement.data('scopeId') ) + }; mapConfig.icon = mapElement.data('icon'); - mapConfig.type = mapElement.data('type'); + mapConfig.type = { + id: parseInt( mapElement.data('typeId') ) + }; + mapConfig.updated = parseInt( mapElement.data('updated') ); mapData.config = mapConfig; // map data ----------------------------------- @@ -2691,19 +2717,31 @@ define([ for(var i = 0; i < systems.length; i++){ // systems data ------------------------------------ - var tempSystem = $(systems[i]); var systemData = {}; systemData.id = parseInt( tempSystem.data('id') ); systemData.systemId = parseInt( tempSystem.data('systemId') ); systemData.name = tempSystem.data('name'); systemData.alias = tempSystem.getSystemInfo(['alias']); - systemData.type = tempSystem.data('type'); - systemData.status = tempSystem.data('status'); systemData.effect = tempSystem.data('effect'); + systemData.type = { + id: tempSystem.data('typeId') + }; + systemData.security = tempSystem.data('security'); systemData.trueSec = tempSystem.data('trueSec'); - systemData.locked = parseInt( tempSystem.data('locked') ); - systemData.rally = parseInt( tempSystem.data('rally') ); + systemData.region = { + id: tempSystem.data('regionId'), + name: tempSystem.data('region') + }; + systemData.constellation = { + id: tempSystem.data('constellationId'), + name: tempSystem.data('constellation') + }; + systemData.status = { + id: tempSystem.data('statusId') + }; + systemData.locked = tempSystem.data('locked') ? 1 : 0; + systemData.rally = tempSystem.data('rally') ? 1 : 0; systemData.currentUser = tempSystem.data('currentUser'); systemData.updated = parseInt( tempSystem.data('updated') ); systemData.userCount = (tempSystem.data('userCount') ? parseInt( tempSystem.data('userCount') ) : 0); @@ -2739,6 +2777,8 @@ define([ var target = $(tempConnection.target); var connectionId = tempConnection.getParameter('connectionId'); + var updated = tempConnection.getParameter('updated'); + var connection = { id: connectionId, @@ -2747,7 +2787,8 @@ define([ target: target.data('id'), targetName: target.data('name'), scope: tempConnection.scope, - type: tempConnection.getType() + type: tempConnection.getType(), + updated: updated }; // add to cache @@ -2772,6 +2813,7 @@ define([ if(typeof activeInstances[mapId] !== 'object'){ // create new instance jsPlumb.Defaults.LogEnabled = true; + var newJsPlumbInstance = jsPlumb.getInstance({ Container: null, // will be set as soon as container is connected to DOM PaintStyle:{ diff --git a/js/app/module_map.js b/js/app/module_map.js index 2b6c6b2c..65cb1b47 100644 --- a/js/app/module_map.js +++ b/js/app/module_map.js @@ -65,12 +65,6 @@ define([ sigTableEditSigTypeSelect: 'pf-sig-table-edit-type-select', // class for editable fields (select) sigTableEditSigNameSelect: 'pf-sig-table-edit-name-select', // class for editable fields (select) sigTableCounterClass: 'pf-sig-table-counter', // class for signature table counter - - // map scopes - mapScopes: [ - {scope: 'wormhole', label: 'W-Space'} - ] - }; var cache = { @@ -498,7 +492,7 @@ define([ var signatureTable = moduleElement.find('.' + config.sigTableMainClass); var signatureDataTable = $(signatureTable).DataTable(); - // TODO save NEW sigantures and get them back with NEW ID :) + // TODO save NEW signatures and get them back with NEW ID :) var systemData = tempFunctionGetSystemData(); // fake data for new signature table entry @@ -2007,7 +2001,7 @@ define([ var tabOptions = { id: parseInt( data.config.id ), - tabClasses: [config.mapTabClass, Util.getInfoForMap( data.config.type, 'classTab') ], + tabClasses: [config.mapTabClass, Util.getInfoForMap( data.config.type.name, 'classTab') ], contentClasses: [config.mapTabContentClass], active: false, icon: data.config.icon, @@ -2052,7 +2046,7 @@ define([ var tabOptions = { id: parseInt( data.config.id ), - tabClasses: [config.mapTabClass, Util.getInfoForMap( data.config.type, 'classTab') ], + tabClasses: [config.mapTabClass, Util.getInfoForMap( data.config.type.name, 'classTab') ], contentClasses: [config.mapTabContentClass], active: activeTab, icon: data.config.icon, diff --git a/js/app/page.js b/js/app/page.js index 50fd925f..4acba84e 100644 --- a/js/app/page.js +++ b/js/app/page.js @@ -563,13 +563,13 @@ define([ requirejs(['text!templates/modules/map_dialog.html', 'mustache'], function(template, Mustache) { var data = { - id: config.newMapDialogId, - scope: config.mapScopes, + id: Init.newMapDialogId, + scope: Util.getMapScopes(), type: Util.getMapTypes(), icon: Util.getMapIcons(), formData: formData }; - + console.log(data); var content = Mustache.render(template, data); var dialogTitle = 'New map'; @@ -946,10 +946,8 @@ define([ }).velocity('fadeIn', { duration: Init.animationSpeed.headerLink }); - } - programStatusCounter--; if(programStatusCounter <= 0){ @@ -961,21 +959,10 @@ define([ if(! programStatusInterval){ programStatusCounter = Init.timer.programStatusVisible; programStatusInterval = setInterval(timer, 1000); - } - - } - - - } - - - - } - }; diff --git a/js/app/util.js b/js/app/util.js index f09c59b2..4132f225 100644 --- a/js/app/util.js +++ b/js/app/util.js @@ -204,6 +204,24 @@ define([ return formData; }; + /** + * checks weather a bootstrap form is valid or not + * validation plugin does not provide a proper function for this + * @returns {boolean} + */ + $.fn.isValidForm = function(){ + var form = $(this); + var valid = false; + + var errorElements = form.find('.has-error'); + + if(errorElements.length === 0){ + valid = true; + } + + return valid; + }; + /** * checks if an element is currently visible in viewport @@ -342,14 +360,12 @@ define([ var mapTypes = []; - $.each(Init.classes.mapTypes, function(prop, data){ + $.each(Init.mapTypes, function(prop, data){ // skip "default" type -> just for 'add' icon if(data.label.length > 0){ - var tempData = { - type: prop, - label: data.label - }; + var tempData = data; + tempData.name = prop; mapTypes.push(tempData); } @@ -368,8 +384,8 @@ define([ var mapInfo = ''; - if(Init.classes.mapTypes.hasOwnProperty(mapType)){ - mapInfo = Init.classes.mapTypes[mapType][option]; + if(Init.mapTypes.hasOwnProperty(mapType)){ + mapInfo = Init.mapTypes[mapType][option]; } return mapInfo; @@ -383,7 +399,9 @@ define([ var scopes = []; $.each(Init.mapScopes, function(prop, data){ - scopes.push(prop); + var tempData = data; + tempData.name = prop; + scopes.push(tempData); }); return scopes; @@ -406,6 +424,23 @@ define([ return scopeInfo; }; + /** + * get some scope info for a given info string + * @param info + * @param option + * @returns {string} + */ + var getScopeInfoForConnection = function(info, option){ + + var scopeInfo = ''; + + if(Init.connectionScopes.hasOwnProperty(info)){ + scopeInfo = Init.connectionScopes[info][option]; + } + + return scopeInfo; + }; + /** * get some system info for a given info string (e.g. rally class) * @param info @@ -544,8 +579,8 @@ define([ var statusInfo = ''; - if( Init.classes.systemStatus.hasOwnProperty(status) ){ - statusInfo = Init.classes.systemStatus[status][option]; + if( Init.systemStatus.hasOwnProperty(status) ){ + statusInfo = Init.systemStatus[status][option]; } return statusInfo; @@ -749,6 +784,7 @@ define([ getInfoForMap: getInfoForMap, getMapScopes: getMapScopes, getScopeInfoForMap: getScopeInfoForMap, + getScopeInfoForConnection: getScopeInfoForConnection, getInfoForSystem: getInfoForSystem, getEffectInfoForSystem: getEffectInfoForSystem, getSystemEffectData: getSystemEffectData, diff --git a/js/lib/validator.min.js b/js/lib/validator.min.js new file mode 100644 index 00000000..3aeaefbe --- /dev/null +++ b/js/lib/validator.min.js @@ -0,0 +1,9 @@ +/*! + * Validator v0.7.2 for Bootstrap 3, by @1000hz + * Copyright 2015 Cina Saffary + * Licensed under http://opensource.org/licenses/MIT + * + * https://github.com/1000hz/bootstrap-validator + */ + ++function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),f=d.data("bs.validator");(f||"destroy"!=b)&&(f||d.data("bs.validator",f=new c(this,e)),"string"==typeof b&&f[b]())})}var c=function(b,c){this.$element=a(b),this.options=c,this.$element.attr("novalidate",!0),this.toggleSubmit(),this.$element.on("input.bs.validator change.bs.validator focusout.bs.validator",a.proxy(this.validateInput,this)),this.$element.on("submit.bs.validator",a.proxy(this.onSubmit,this)),this.$element.find("[data-match]").each(function(){var b=a(this),c=b.data("match");a(c).on("input.bs.validator",function(){b.val()&&b.trigger("input.bs.validator")})})};c.DEFAULTS={delay:500,html:!1,disable:!0,errors:{match:"Does not match",minlength:"Not long enough"}},c.VALIDATORS={"native":function(a){var b=a[0];return b.checkValidity?b.checkValidity():!0},match:function(b){var c=b.data("match");return!b.val()||b.val()===a(c).val()},minlength:function(a){var b=a.data("minlength");return!a.val()||a.val().length>=b}},c.prototype.validateInput=function(b){var c=a(b.target),d=c.data("bs.validator.errors");if(c.is('[type="radio"]')&&(c=this.$element.find('input[name="'+c.attr("name")+'"]')),this.$element.trigger(b=a.Event("validate.bs.validator",{relatedTarget:c[0]})),!b.isDefaultPrevented()){var e=this;this.runValidators(c).done(function(f){c.data("bs.validator.errors",f),f.length?e.showErrors(c):e.clearErrors(c),d&&f.toString()===d.toString()||(b=f.length?a.Event("invalid.bs.validator",{relatedTarget:c[0],detail:f}):a.Event("valid.bs.validator",{relatedTarget:c[0],detail:d}),e.$element.trigger(b)),e.toggleSubmit(),e.$element.trigger(a.Event("validated.bs.validator",{relatedTarget:c[0]}))})}},c.prototype.runValidators=function(b){function d(a){return b.data(a+"-error")||b.data("error")||"native"==a&&b[0].validationMessage||g.errors[a]}var e=[],f=([c.VALIDATORS.native],a.Deferred()),g=this.options;return b.data("bs.validator.deferred")&&b.data("bs.validator.deferred").reject(),b.data("bs.validator.deferred",f),a.each(c.VALIDATORS,a.proxy(function(a,c){if((b.data(a)||"native"==a)&&!c.call(this,b)){var f=d(a);!~e.indexOf(f)&&e.push(f)}},this)),!e.length&&b.val()&&b.data("remote")?this.defer(b,function(){var c={};c[b.attr("name")]=b.val(),a.get(b.data("remote"),c).fail(function(a,b,c){e.push(d("remote")||c)}).always(function(){f.resolve(e)})}):f.resolve(e),f.promise()},c.prototype.validate=function(){var a=this.options.delay;return this.options.delay=0,this.$element.find(":input").trigger("input.bs.validator"),this.options.delay=a,this},c.prototype.showErrors=function(b){var c=this.options.html?"html":"text";this.defer(b,function(){var d=b.closest(".form-group"),e=d.find(".help-block.with-errors"),f=b.data("bs.validator.errors");f.length&&(f=a("
    ").addClass("list-unstyled").append(a.map(f,function(b){return a("
  • ")[c](b)})),void 0===e.data("bs.validator.originalContent")&&e.data("bs.validator.originalContent",e.html()),e.empty().append(f),d.addClass("has-error"))})},c.prototype.clearErrors=function(a){var b=a.closest(".form-group"),c=b.find(".help-block.with-errors");c.html(c.data("bs.validator.originalContent")),b.removeClass("has-error")},c.prototype.hasErrors=function(){function b(){return!!(a(this).data("bs.validator.errors")||[]).length}return!!this.$element.find(":input:enabled").filter(b).length},c.prototype.isIncomplete=function(){function b(){return"checkbox"===this.type?!this.checked:"radio"===this.type?!a('[name="'+this.name+'"]:checked').length:""===a.trim(this.value)}return!!this.$element.find(":input[required]:enabled").filter(b).length},c.prototype.onSubmit=function(a){this.validate(),(this.isIncomplete()||this.hasErrors())&&a.preventDefault()},c.prototype.toggleSubmit=function(){if(this.options.disable){var a=this.$element.find('input[type="submit"], button[type="submit"]');a.toggleClass("disabled",this.isIncomplete()||this.hasErrors()).css({"pointer-events":"all",cursor:"pointer"})}},c.prototype.defer=function(a,b){return this.options.delay?(window.clearTimeout(a.data("bs.validator.timeout")),void a.data("bs.validator.timeout",window.setTimeout(b,this.options.delay))):b()},c.prototype.destroy=function(){return this.$element.removeAttr("novalidate").removeData("bs.validator").off(".bs.validator"),this.$element.find(":input").off(".bs.validator").removeData(["bs.validator.errors","bs.validator.deferred"]).each(function(){var b=a(this),c=b.data("bs.validator.timeout");window.clearTimeout(c)&&b.removeData("bs.validator.timeout")}),this.$element.find(".help-block.with-errors").each(function(){var b=a(this),c=b.data("bs.validator.originalContent");b.removeData("bs.validator.originalContent").html(c)}),this.$element.find('input[type="submit"], button[type="submit"]').removeClass("disabled"),this.$element.find(".has-error").removeClass("has-error"),this};var d=a.fn.validator;a.fn.validator=b,a.fn.validator.Constructor=c,a.fn.validator.noConflict=function(){return a.fn.validator=d,this},a(window).on("load",function(){a('form[data-toggle="validator"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery); \ No newline at end of file diff --git a/public/css/pathfinder.css b/public/css/pathfinder.css index c0b96b63..2701960f 100644 --- a/public/css/pathfinder.css +++ b/public/css/pathfinder.css @@ -15,7 +15,7 @@ * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world by @mdo and @fat. - */*{-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:62.5%;-webkit-tap-highlight-color:transparent}body{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:1.5;color:#63676a;background-color:#313335}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#375959;text-decoration:none}a:hover,a:focus{color:#1a2a2a;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;text-decoration:none}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#313335;border:1px solid #ddd;border-radius:0px;-webkit-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:18px;margin-bottom:18px;border:0;border-top:1px solid #adadad}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;line-height:1.1;color:inherit}h1 small,h1 .small,h2 small,h2 .small,h3 small,h3 .small,h4 small,h4 .small,h5 small,h5 .small,h6 small,h6 .small,.h1 small,.h1 .small,.h2 small,.h2 .small,.h3 small,.h3 .small,.h4 small,.h4 .small,.h5 small,.h5 .small,.h6 small,.h6 .small{font-weight:normal;line-height:1;color:#63676a}h1,.h1,h2,.h2,h3,.h3{margin-top:18px;margin-bottom:9px}h1 small,h1 .small,.h1 small,.h1 .small,h2 small,h2 .small,.h2 small,.h2 .small,h3 small,h3 .small,.h3 small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:9px;margin-bottom:9px}h4 small,h4 .small,.h4 small,.h4 .small,h5 small,h5 .small,.h5 small,.h5 .small,h6 small,h6 .small,.h6 small,.h6 .small{font-size:75%}h1,.h1{font-size:22px}h2,.h2{font-size:14px}h3,.h3{font-size:17px}h4,.h4{font-size:12px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:13px;font-weight:200;line-height:1.4}@media (min-width: 780px){.lead{font-size:18px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#63676a}.text-primary{color:#375959}a.text-primary:hover{color:#243939}.text-success{color:#2b2b2b}a.text-success:hover{color:#121212}.text-info{color:#2b2b2b}a.text-info:hover{color:#121212}.text-warning{color:#2b2b2b}a.text-warning:hover{color:#121212}.text-danger{color:#2b2b2b}a.text-danger:hover{color:#121212}.bg-primary{color:#fff}.bg-primary{background-color:#375959}a.bg-primary:hover{background-color:#243939}.bg-success{background-color:#d1e8d1}a.bg-success:hover{background-color:#afd7af}.bg-info{background-color:#abc9e2}a.bg-info:hover{background-color:#85b0d5}.bg-warning{background-color:#fef8f0}a.bg-warning:hover{background-color:#fbe3c0}.bg-danger{background-color:#f6d1d0}a.bg-danger:hover{background-color:#eda7a5}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #adadad}ul,ol{margin-top:0;margin-bottom:9px}ul ul,ul ol,ol ul,ol ol{margin-bottom:0}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dt,dd{line-height:1.5}dt{font-weight:bold}dd{margin-left:0}@media (min-width: 780px){.dl-horizontal dt{float:left;width:80px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:100px}.dl-horizontal dd:before,.dl-horizontal dd:after{content:" ";display:table}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #63676a}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:9px 18px;margin:0 0 18px;font-size:15px;border-left:5px solid #5cb85c}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.5;color:#63676a}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #5cb85c;border-left:0;text-align:right}.blockquote-reverse footer:before,.blockquote-reverse small:before,.blockquote-reverse .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,.blockquote-reverse small:after,.blockquote-reverse .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:18px;font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:0px}kbd{padding:2px 4px;font-size:90%;color:#adadad;background-color:#2b2b2b;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#313335;background-color:#f5f5f5;border:1px solid #ccc;border-radius:0px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:10px;padding-right:10px}.container:before,.container:after{content:" ";display:table}.container:after{clear:both}@media (min-width: 780px){.container{width:740px}}@media (min-width: 1200px){.container{width:960px}}@media (min-width: 1600px){.container{width:1160px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:10px;padding-right:10px}.container-fluid:before,.container-fluid:after{content:" ";display:table}.container-fluid:after{clear:both}.row{margin-left:-10px;margin-right:-10px}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:10px;padding-right:10px}.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-1{width:8.3333333333%}.col-xs-2{width:16.6666666667%}.col-xs-3{width:25%}.col-xs-4{width:33.3333333333%}.col-xs-5{width:41.6666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.3333333333%}.col-xs-8{width:66.6666666667%}.col-xs-9{width:75%}.col-xs-10{width:83.3333333333%}.col-xs-11{width:91.6666666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:0%}.col-xs-pull-1{right:8.3333333333%}.col-xs-pull-2{right:16.6666666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.3333333333%}.col-xs-pull-5{right:41.6666666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.3333333333%}.col-xs-pull-8{right:66.6666666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.3333333333%}.col-xs-pull-11{right:91.6666666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:0%}.col-xs-push-1{left:8.3333333333%}.col-xs-push-2{left:16.6666666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.3333333333%}.col-xs-push-5{left:41.6666666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.3333333333%}.col-xs-push-8{left:66.6666666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.3333333333%}.col-xs-push-11{left:91.6666666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0%}.col-xs-offset-1{margin-left:8.3333333333%}.col-xs-offset-2{margin-left:16.6666666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.3333333333%}.col-xs-offset-5{margin-left:41.6666666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.3333333333%}.col-xs-offset-8{margin-left:66.6666666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.3333333333%}.col-xs-offset-11{margin-left:91.6666666667%}.col-xs-offset-12{margin-left:100%}@media (min-width: 780px){.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-1{width:8.3333333333%}.col-sm-2{width:16.6666666667%}.col-sm-3{width:25%}.col-sm-4{width:33.3333333333%}.col-sm-5{width:41.6666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.3333333333%}.col-sm-8{width:66.6666666667%}.col-sm-9{width:75%}.col-sm-10{width:83.3333333333%}.col-sm-11{width:91.6666666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:0%}.col-sm-pull-1{right:8.3333333333%}.col-sm-pull-2{right:16.6666666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.3333333333%}.col-sm-pull-5{right:41.6666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.3333333333%}.col-sm-pull-8{right:66.6666666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.3333333333%}.col-sm-pull-11{right:91.6666666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:0%}.col-sm-push-1{left:8.3333333333%}.col-sm-push-2{left:16.6666666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.3333333333%}.col-sm-push-5{left:41.6666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.3333333333%}.col-sm-push-8{left:66.6666666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.3333333333%}.col-sm-push-11{left:91.6666666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0%}.col-sm-offset-1{margin-left:8.3333333333%}.col-sm-offset-2{margin-left:16.6666666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.3333333333%}.col-sm-offset-5{margin-left:41.6666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.3333333333%}.col-sm-offset-8{margin-left:66.6666666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.3333333333%}.col-sm-offset-11{margin-left:91.6666666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width: 1200px){.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-1{width:8.3333333333%}.col-md-2{width:16.6666666667%}.col-md-3{width:25%}.col-md-4{width:33.3333333333%}.col-md-5{width:41.6666666667%}.col-md-6{width:50%}.col-md-7{width:58.3333333333%}.col-md-8{width:66.6666666667%}.col-md-9{width:75%}.col-md-10{width:83.3333333333%}.col-md-11{width:91.6666666667%}.col-md-12{width:100%}.col-md-pull-0{right:0%}.col-md-pull-1{right:8.3333333333%}.col-md-pull-2{right:16.6666666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.3333333333%}.col-md-pull-5{right:41.6666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.3333333333%}.col-md-pull-8{right:66.6666666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.3333333333%}.col-md-pull-11{right:91.6666666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:0%}.col-md-push-1{left:8.3333333333%}.col-md-push-2{left:16.6666666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.3333333333%}.col-md-push-5{left:41.6666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.3333333333%}.col-md-push-8{left:66.6666666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.3333333333%}.col-md-push-11{left:91.6666666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0%}.col-md-offset-1{margin-left:8.3333333333%}.col-md-offset-2{margin-left:16.6666666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.3333333333%}.col-md-offset-5{margin-left:41.6666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.3333333333%}.col-md-offset-8{margin-left:66.6666666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.3333333333%}.col-md-offset-11{margin-left:91.6666666667%}.col-md-offset-12{margin-left:100%}}@media (min-width: 1600px){.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-1{width:8.3333333333%}.col-lg-2{width:16.6666666667%}.col-lg-3{width:25%}.col-lg-4{width:33.3333333333%}.col-lg-5{width:41.6666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.3333333333%}.col-lg-8{width:66.6666666667%}.col-lg-9{width:75%}.col-lg-10{width:83.3333333333%}.col-lg-11{width:91.6666666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:0%}.col-lg-pull-1{right:8.3333333333%}.col-lg-pull-2{right:16.6666666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.3333333333%}.col-lg-pull-5{right:41.6666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.3333333333%}.col-lg-pull-8{right:66.6666666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.3333333333%}.col-lg-pull-11{right:91.6666666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:0%}.col-lg-push-1{left:8.3333333333%}.col-lg-push-2{left:16.6666666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.3333333333%}.col-lg-push-5{left:41.6666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.3333333333%}.col-lg-push-8{left:66.6666666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.3333333333%}.col-lg-push-11{left:91.6666666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0%}.col-lg-offset-1{margin-left:8.3333333333%}.col-lg-offset-2{margin-left:16.6666666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.3333333333%}.col-lg-offset-5{margin-left:41.6666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.3333333333%}.col-lg-offset-8{margin-left:66.6666666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.3333333333%}.col-lg-offset-11{margin-left:91.6666666667%}.col-lg-offset-12{margin-left:100%}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:0;border-spacing:0}.table>thead>tr>th,.table>thead>tr>td,.table>tbody>tr>th,.table>tbody>tr>td,.table>tfoot>tr>th,.table>tfoot>tr>td{padding:8px;line-height:1.5;vertical-align:top;border-top:1px solid #313335}.table>thead>tr>th{vertical-align:bottom;border-bottom:0px solid #313335}.table>caption+thead>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>th,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #313335}.table .table{background-color:#313335}.table-condensed>thead>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>tfoot>tr>td{padding:2px}.table-bordered{border:1px solid #313335}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>td{border:1px solid #313335}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#ecf3f8}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>thead>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th{background-color:#ecf3f8}.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.active:hover>th{background-color:#d9e7f1}.table>thead>tr>td.success,.table>thead>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th{background-color:#d1e8d1}.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.success:hover>th{background-color:#c0e0c0}.table>thead>tr>td.info,.table>thead>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th{background-color:#abc9e2}.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.info:hover>th{background-color:#98bcdc}.table>thead>tr>td.warning,.table>thead>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th{background-color:#fef8f0}.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.warning:hover>th{background-color:#fdedd8}.table>thead>tr>td.danger,.table>thead>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th{background-color:#f6d1d0}.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.danger:hover>th{background-color:#f1bcba}@media (max-width: 779px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #313335;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>th,.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>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th: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>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th: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>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:18px;line-height:inherit;color:#313335;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:12px;line-height:1.5;color:#adadad}.form-control{display:block;width:100%;height:32px;padding:6px 12px;font-size:12px;line-height:1.5;color:#adadad;background-color:#313335;background-image:none;border:1px solid #63676a;border-radius:0px;-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 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.form-control:focus{border-color:#568a89;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(86,138,137,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(86,138,137,0.6)}.form-control::-moz-placeholder{color:#63676a;opacity:1}.form-control:-ms-input-placeholder{color:#63676a}.form-control::-webkit-input-placeholder{color:#63676a}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#adadad;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"]{line-height:32px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:18px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],fieldset[disabled] input[type="checkbox"],.radio[disabled],fieldset[disabled] .radio,.radio-inline[disabled],fieldset[disabled] .radio-inline,.checkbox[disabled],fieldset[disabled] .checkbox,.checkbox-inline[disabled],fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-group-sm>.input-group-btn>button.DTTT_button,.input-group-sm>.input-group-btn>div.DTTT_button,.input-group-sm>.input-group-btn>a.DTTT_button{height:28px;padding:5px 10px;font-size:11px;line-height:1.5;border-radius:3px}select.input-sm,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,.input-group-sm>.input-group-btn>select.btn{height:28px;line-height:28px}textarea.input-sm,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,.input-group-sm>.input-group-btn>textarea.btn,select[multiple].input-sm,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>.input-group-btn>select[multiple].btn{height:auto}.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-group-lg>.input-group-btn>button.DTTT_button,.input-group-lg>.input-group-btn>div.DTTT_button,.input-group-lg>.input-group-btn>a.DTTT_button{height:42px;padding:10px 16px;font-size:15px;line-height:1.33;border-radius:6px}select.input-lg,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,.input-group-lg>.input-group-btn>select.btn{height:42px;line-height:42px}textarea.input-lg,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,.input-group-lg>.input-group-btn>textarea.btn,select[multiple].input-lg,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>.input-group-btn>select[multiple].btn{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.has-feedback .form-control-feedback{position:absolute;top:23px;right:0;display:block;width:32px;height:32px;line-height:32px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#2b2b2b}.has-success .form-control{border-color:#2b2b2b;-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:#121212;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e}.has-success .input-group-addon{color:#2b2b2b;border-color:#2b2b2b;background-color:#d1e8d1}.has-success .form-control-feedback{color:#2b2b2b}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#2b2b2b}.has-warning .form-control{border-color:#2b2b2b;-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:#121212;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e}.has-warning .input-group-addon{color:#2b2b2b;border-color:#2b2b2b;background-color:#fef8f0}.has-warning .form-control-feedback{color:#2b2b2b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#2b2b2b}.has-error .form-control{border-color:#2b2b2b;-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:#121212;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e}.has-error .input-group-addon{color:#2b2b2b;border-color:#2b2b2b;background-color:#f6d1d0}.has-error .form-control-feedback{color:#2b2b2b}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#a3a7a9}@media (min-width: 780px){.form-inline .form-group,.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control,.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control,.navbar-form .input-group>.form-control{width:100%}.form-inline .control-label,.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.navbar-form .radio,.form-inline .checkbox,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type="radio"],.navbar-form .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback,.navbar-form .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:25px}.form-horizontal .form-group{margin-left:-10px;margin-right:-10px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{content:" ";display:table}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media (min-width: 780px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:10px}.btn,button.DTTT_button,div.DTTT_button,a.DTTT_button{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:12px;line-height:1.5;border-radius:0px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,button.DTTT_button:focus,div.DTTT_button:focus,a.DTTT_button:focus,.btn:active:focus,button.DTTT_button:active:focus,div.DTTT_button:active:focus,a.DTTT_button:active:focus,.btn.active:focus,button.active.DTTT_button:focus,div.active.DTTT_button:focus,a.active.DTTT_button:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,button.DTTT_button:hover,div.DTTT_button:hover,a.DTTT_button:hover,.btn:focus,button.DTTT_button:focus,div.DTTT_button:focus,a.DTTT_button:focus{color:#eaeaea;text-decoration:none}.btn:active,button.DTTT_button:active,div.DTTT_button:active,a.DTTT_button:active,.btn.active,button.active.DTTT_button,div.active.DTTT_button,a.active.DTTT_button{outline:0;background-image:none;-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,button.disabled.DTTT_button,div.disabled.DTTT_button,a.disabled.DTTT_button,.btn[disabled],button[disabled].DTTT_button,div[disabled].DTTT_button,a[disabled].DTTT_button,fieldset[disabled] .btn,fieldset[disabled] button.DTTT_button,fieldset[disabled] div.DTTT_button,fieldset[disabled] a.DTTT_button{cursor:not-allowed;pointer-events:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default,button.DTTT_button,div.DTTT_button,a.DTTT_button{color:#eaeaea;background-color:#63676a;border-color:#575a5d}.btn-default:hover,button.DTTT_button:hover,div.DTTT_button:hover,a.DTTT_button:hover,.btn-default:focus,button.DTTT_button:focus,div.DTTT_button:focus,a.DTTT_button:focus,.btn-default:active,button.DTTT_button:active,div.DTTT_button:active,a.DTTT_button:active,.btn-default.active,button.active.DTTT_button,div.active.DTTT_button,a.active.DTTT_button{color:#eaeaea;background-color:#777b7f;border-color:#74797c}.open .btn-default.dropdown-toggle,.open button.dropdown-toggle.DTTT_button,.open div.dropdown-toggle.DTTT_button,.open a.dropdown-toggle.DTTT_button{color:#eaeaea;background-color:#777b7f;border-color:#74797c}.btn-default:active,button.DTTT_button:active,div.DTTT_button:active,a.DTTT_button:active,.btn-default.active,button.active.DTTT_button,div.active.DTTT_button,a.active.DTTT_button{background-image:none}.open .btn-default.dropdown-toggle,.open button.dropdown-toggle.DTTT_button,.open div.dropdown-toggle.DTTT_button,.open a.dropdown-toggle.DTTT_button{background-image:none}.btn-default.disabled,button.disabled.DTTT_button,div.disabled.DTTT_button,a.disabled.DTTT_button,.btn-default.disabled:hover,button.disabled.DTTT_button:hover,div.disabled.DTTT_button:hover,a.disabled.DTTT_button:hover,.btn-default.disabled:focus,button.disabled.DTTT_button:focus,div.disabled.DTTT_button:focus,a.disabled.DTTT_button:focus,.btn-default.disabled:active,button.disabled.DTTT_button:active,div.disabled.DTTT_button:active,a.disabled.DTTT_button:active,.btn-default.disabled.active,button.disabled.active.DTTT_button,div.disabled.active.DTTT_button,a.disabled.active.DTTT_button,.btn-default[disabled],button[disabled].DTTT_button,div[disabled].DTTT_button,a[disabled].DTTT_button,.btn-default[disabled]:hover,button[disabled].DTTT_button:hover,div[disabled].DTTT_button:hover,a[disabled].DTTT_button:hover,.btn-default[disabled]:focus,button[disabled].DTTT_button:focus,div[disabled].DTTT_button:focus,a[disabled].DTTT_button:focus,.btn-default[disabled]:active,button[disabled].DTTT_button:active,div[disabled].DTTT_button:active,a[disabled].DTTT_button:active,.btn-default[disabled].active,button[disabled].active.DTTT_button,div[disabled].active.DTTT_button,a[disabled].active.DTTT_button,fieldset[disabled] .btn-default,fieldset[disabled] button.DTTT_button,fieldset[disabled] div.DTTT_button,fieldset[disabled] a.DTTT_button,fieldset[disabled] .btn-default:hover,fieldset[disabled] button.DTTT_button:hover,fieldset[disabled] div.DTTT_button:hover,fieldset[disabled] a.DTTT_button:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] button.DTTT_button:focus,fieldset[disabled] div.DTTT_button:focus,fieldset[disabled] a.DTTT_button:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] button.DTTT_button:active,fieldset[disabled] div.DTTT_button:active,fieldset[disabled] a.DTTT_button:active,fieldset[disabled] .btn-default.active,fieldset[disabled] button.active.DTTT_button,fieldset[disabled] div.active.DTTT_button,fieldset[disabled] a.active.DTTT_button{background-color:#63676a;border-color:#575a5d}.btn-default .badge,button.DTTT_button .badge,div.DTTT_button .badge,a.DTTT_button .badge{color:#63676a;background-color:#eaeaea}.btn-primary{color:#eaeaea;background-color:#375959;border-color:#2d4949}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active{color:#eaeaea;background-color:#477272;border-color:#456f6f}.open .btn-primary.dropdown-toggle{color:#eaeaea;background-color:#477272;border-color:#456f6f}.btn-primary:active,.btn-primary.active{background-image:none}.open .btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled,.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled:active,.btn-primary.disabled.active,.btn-primary[disabled],.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled]:active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary.active{background-color:#375959;border-color:#2d4949}.btn-primary .badge{color:#375959;background-color:#eaeaea}.btn-success{color:#eaeaea;background-color:#4f9e4f;border-color:#478d47}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active{color:#eaeaea;background-color:#64b264;border-color:#61b061}.open .btn-success.dropdown-toggle{color:#eaeaea;background-color:#64b264;border-color:#61b061}.btn-success:active,.btn-success.active{background-image:none}.open .btn-success.dropdown-toggle{background-image:none}.btn-success.disabled,.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled:active,.btn-success.disabled.active,.btn-success[disabled],.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled]:active,.btn-success[disabled].active,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success.active{background-color:#4f9e4f;border-color:#478d47}.btn-success .badge{color:#4f9e4f;background-color:#eaeaea}.btn-info{color:#eaeaea;background-color:#316490;border-color:#2b577d}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active{color:#eaeaea;background-color:#3b79ae;border-color:#3a76ab}.open .btn-info.dropdown-toggle{color:#eaeaea;background-color:#3b79ae;border-color:#3a76ab}.btn-info:active,.btn-info.active{background-image:none}.open .btn-info.dropdown-toggle{background-image:none}.btn-info.disabled,.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled:active,.btn-info.disabled.active,.btn-info[disabled],.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled]:active,.btn-info[disabled].active,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info.active{background-color:#316490;border-color:#2b577d}.btn-info .badge{color:#316490;background-color:#eaeaea}.btn-warning{color:#eaeaea;background-color:#e28a0d;border-color:#ca7b0c}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active{color:#eaeaea;background-color:#f29e25;border-color:#f29c20}.open .btn-warning.dropdown-toggle{color:#eaeaea;background-color:#f29e25;border-color:#f29c20}.btn-warning:active,.btn-warning.active{background-image:none}.open .btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled,.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled:active,.btn-warning.disabled.active,.btn-warning[disabled],.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled]:active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning.active{background-color:#e28a0d;border-color:#ca7b0c}.btn-warning .badge{color:#e28a0d;background-color:#eaeaea}.btn-danger{color:#eaeaea;background-color:#a52521;border-color:#90201d}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active{color:#eaeaea;background-color:#c72d28;border-color:#c32c27}.open .btn-danger.dropdown-toggle{color:#eaeaea;background-color:#c72d28;border-color:#c32c27}.btn-danger:active,.btn-danger.active{background-image:none}.open .btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled,.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled:active,.btn-danger.disabled.active,.btn-danger[disabled],.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled]:active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger.active{background-color:#a52521;border-color:#90201d}.btn-danger .badge{color:#a52521;background-color:#eaeaea}.btn-link{color:#375959;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#1a2a2a;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus{color:#63676a;text-decoration:none}.btn-lg,.btn-group-lg>.btn,.btn-group-lg>button.DTTT_button,.btn-group-lg>div.DTTT_button,.btn-group-lg>a.DTTT_button{padding:10px 16px;font-size:15px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn,.btn-group-sm>button.DTTT_button,.btn-group-sm>div.DTTT_button,.btn-group-sm>a.DTTT_button,button.DTTT_button,div.DTTT_button,a.DTTT_button{padding:5px 10px;font-size:11px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn,.btn-group-xs>button.DTTT_button,.btn-group-xs>div.DTTT_button,.btn-group-xs>a.DTTT_button{padding:1px 5px;font-size:11px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.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;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;transition:height 0.35s ease}@font-face{font-family:'Glyphicons Halflings';src:url("../fonts/glyphicons-halflings-regular.eot");src:url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/glyphicons-halflings-regular.woff") format("woff"),url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"),url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.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;list-style:none;font-size:12px;background-color:#adadad;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:0px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4);background-clip:padding-box;border-radius:5px}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#63676a}.dropdown-menu>li>a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:1.5;color:#313335;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#1d1d1d;background-color:#63676a}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#adadad;text-decoration:none;outline:0;background-color:#375959}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#63676a}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:11px;line-height:1.5;color:#63676a}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width: 780px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group>button.DTTT_button,.btn-group>div.DTTT_button,.btn-group>a.DTTT_button,.btn-group-vertical>.btn,.btn-group-vertical>button.DTTT_button,.btn-group-vertical>div.DTTT_button,.btn-group-vertical>a.DTTT_button{position:relative;float:left}.btn-group>.btn:hover,.btn-group>button.DTTT_button:hover,.btn-group>div.DTTT_button:hover,.btn-group>a.DTTT_button:hover,.btn-group>.btn:focus,.btn-group>button.DTTT_button:focus,.btn-group>div.DTTT_button:focus,.btn-group>a.DTTT_button:focus,.btn-group>.btn:active,.btn-group>button.DTTT_button:active,.btn-group>div.DTTT_button:active,.btn-group>a.DTTT_button:active,.btn-group>.btn.active,.btn-group>button.active.DTTT_button,.btn-group>div.active.DTTT_button,.btn-group>a.active.DTTT_button,.btn-group-vertical>.btn:hover,.btn-group-vertical>button.DTTT_button:hover,.btn-group-vertical>div.DTTT_button:hover,.btn-group-vertical>a.DTTT_button:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>button.DTTT_button:focus,.btn-group-vertical>div.DTTT_button:focus,.btn-group-vertical>a.DTTT_button:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>button.DTTT_button:active,.btn-group-vertical>div.DTTT_button:active,.btn-group-vertical>a.DTTT_button:active,.btn-group-vertical>.btn.active,.btn-group-vertical>button.active.DTTT_button,.btn-group-vertical>div.active.DTTT_button,.btn-group-vertical>a.active.DTTT_button{z-index:2}.btn-group>.btn:focus,.btn-group>button.DTTT_button:focus,.btn-group>div.DTTT_button:focus,.btn-group>a.DTTT_button:focus,.btn-group-vertical>.btn:focus,.btn-group-vertical>button.DTTT_button:focus,.btn-group-vertical>div.DTTT_button:focus,.btn-group-vertical>a.DTTT_button:focus{outline:none}.btn-group .btn+.btn,.btn-group button.DTTT_button+.btn,.btn-group div.DTTT_button+.btn,.btn-group a.DTTT_button+.btn,.btn-group .btn+button.DTTT_button,.btn-group button.DTTT_button+button.DTTT_button,.btn-group div.DTTT_button+button.DTTT_button,.btn-group a.DTTT_button+button.DTTT_button,.btn-group .btn+div.DTTT_button,.btn-group button.DTTT_button+div.DTTT_button,.btn-group div.DTTT_button+div.DTTT_button,.btn-group a.DTTT_button+div.DTTT_button,.btn-group .btn+a.DTTT_button,.btn-group button.DTTT_button+a.DTTT_button,.btn-group div.DTTT_button+a.DTTT_button,.btn-group a.DTTT_button+a.DTTT_button,.btn-group .btn+.btn-group,.btn-group button.DTTT_button+.btn-group,.btn-group div.DTTT_button+.btn-group,.btn-group a.DTTT_button+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+button.DTTT_button,.btn-group .btn-group+div.DTTT_button,.btn-group .btn-group+a.DTTT_button,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:before,.btn-toolbar:after{content:" ";display:table}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>button.DTTT_button,.btn-toolbar>div.DTTT_button,.btn-toolbar>a.DTTT_button,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle),.btn-group>button.DTTT_button:not(:first-child):not(:last-child):not(.dropdown-toggle),.btn-group>div.DTTT_button:not(:first-child):not(:last-child):not(.dropdown-toggle),.btn-group>a.DTTT_button:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child,.btn-group>button.DTTT_button:first-child,.btn-group>div.DTTT_button:first-child,.btn-group>a.DTTT_button:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle),.btn-group>button.DTTT_button:first-child:not(:last-child):not(.dropdown-toggle),.btn-group>div.DTTT_button:first-child:not(:last-child):not(.dropdown-toggle),.btn-group>a.DTTT_button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>button.DTTT_button:last-child:not(:first-child),.btn-group>div.DTTT_button:last-child:not(:first-child),.btn-group>a.DTTT_button:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn-group:not(:first-child):not(:last-child)>button.DTTT_button,.btn-group>.btn-group:not(:first-child):not(:last-child)>div.DTTT_button,.btn-group>.btn-group:not(:first-child):not(:last-child)>a.DTTT_button{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>button.DTTT_button:last-child,.btn-group>.btn-group:first-child>div.DTTT_button:last-child,.btn-group>.btn-group:first-child>a.DTTT_button:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child,.btn-group>.btn-group:last-child>button.DTTT_button:first-child,.btn-group>.btn-group:last-child>div.DTTT_button:first-child,.btn-group>.btn-group:last-child>a.DTTT_button:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle,.btn-group>button.DTTT_button+.dropdown-toggle,.btn-group>div.DTTT_button+.dropdown-toggle,.btn-group>a.DTTT_button+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group-lg.btn-group>button.DTTT_button+.dropdown-toggle,.btn-group-lg.btn-group>div.DTTT_button+.dropdown-toggle,.btn-group-lg.btn-group>a.DTTT_button+.dropdown-toggle{padding-left:12px;padding-right: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,button.DTTT_button .caret,div.DTTT_button .caret,a.DTTT_button .caret{margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret,.btn-group-lg>button.DTTT_button .caret,.btn-group-lg>div.DTTT_button .caret,.btn-group-lg>a.DTTT_button .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .caret,.dropup .btn-group-lg>button.DTTT_button .caret,.dropup .btn-group-lg>div.DTTT_button .caret,.dropup .btn-group-lg>a.DTTT_button .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>button.DTTT_button,.btn-group-vertical>div.DTTT_button,.btn-group-vertical>a.DTTT_button,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn,.btn-group-vertical>.btn-group>button.DTTT_button,.btn-group-vertical>.btn-group>div.DTTT_button,.btn-group-vertical>.btn-group>a.DTTT_button{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{content:" ";display:table}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn,.btn-group-vertical>.btn-group>button.DTTT_button,.btn-group-vertical>.btn-group>div.DTTT_button,.btn-group-vertical>.btn-group>a.DTTT_button{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>button.DTTT_button+.btn,.btn-group-vertical>div.DTTT_button+.btn,.btn-group-vertical>a.DTTT_button+.btn,.btn-group-vertical>.btn+button.DTTT_button,.btn-group-vertical>button.DTTT_button+button.DTTT_button,.btn-group-vertical>div.DTTT_button+button.DTTT_button,.btn-group-vertical>a.DTTT_button+button.DTTT_button,.btn-group-vertical>.btn+div.DTTT_button,.btn-group-vertical>button.DTTT_button+div.DTTT_button,.btn-group-vertical>div.DTTT_button+div.DTTT_button,.btn-group-vertical>a.DTTT_button+div.DTTT_button,.btn-group-vertical>.btn+a.DTTT_button,.btn-group-vertical>button.DTTT_button+a.DTTT_button,.btn-group-vertical>div.DTTT_button+a.DTTT_button,.btn-group-vertical>a.DTTT_button+a.DTTT_button,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>button.DTTT_button+.btn-group,.btn-group-vertical>div.DTTT_button+.btn-group,.btn-group-vertical>a.DTTT_button+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+button.DTTT_button,.btn-group-vertical>.btn-group+div.DTTT_button,.btn-group-vertical>.btn-group+a.DTTT_button,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group-vertical>button.DTTT_button:not(:first-child):not(:last-child),.btn-group-vertical>div.DTTT_button:not(:first-child):not(:last-child),.btn-group-vertical>a.DTTT_button:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child),.btn-group-vertical>button.DTTT_button:first-child:not(:last-child),.btn-group-vertical>div.DTTT_button:first-child:not(:last-child),.btn-group-vertical>a.DTTT_button:first-child:not(:last-child){border-top-right-radius:0px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child),.btn-group-vertical>button.DTTT_button:last-child:not(:first-child),.btn-group-vertical>div.DTTT_button:last-child:not(:first-child),.btn-group-vertical>a.DTTT_button:last-child:not(:first-child){border-bottom-left-radius:0px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>button.DTTT_button,.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>div.DTTT_button,.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>a.DTTT_button{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)>button.DTTT_button:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>div.DTTT_button:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>a.DTTT_button: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,.btn-group-vertical>.btn-group:last-child:not(:first-child)>button.DTTT_button:first-child,.btn-group-vertical>.btn-group:last-child:not(:first-child)>div.DTTT_button:first-child,.btn-group-vertical>.btn-group:last-child:not(:first-child)>a.DTTT_button:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>button.DTTT_button,.btn-group-justified>div.DTTT_button,.btn-group-justified>a.DTTT_button,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn,.btn-group-justified>.btn-group button.DTTT_button,.btn-group-justified>.btn-group div.DTTT_button,.btn-group-justified>.btn-group a.DTTT_button{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>button.DTTT_button>input[type="radio"],[data-toggle="buttons"]>div.DTTT_button>input[type="radio"],[data-toggle="buttons"]>a.DTTT_button>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"],[data-toggle="buttons"]>button.DTTT_button>input[type="checkbox"],[data-toggle="buttons"]>div.DTTT_button>input[type="checkbox"],[data-toggle="buttons"]>a.DTTT_button>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-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:12px;font-weight:normal;line-height:1;color:#63676a;text-align:center;background-color:#2b2b2b;border:1px solid #63676a;border-radius:0px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn,.input-group-sm>.input-group-btn>button.input-group-addon.DTTT_button,.input-group-sm>.input-group-btn>div.input-group-addon.DTTT_button,.input-group-sm>.input-group-btn>a.input-group-addon.DTTT_button{padding:5px 10px;font-size:11px;border-radius:3px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn,.input-group-lg>.input-group-btn>button.input-group-addon.DTTT_button,.input-group-lg>.input-group-btn>div.input-group-addon.DTTT_button,.input-group-lg>.input-group-btn>a.input-group-addon.DTTT_button{padding:10px 16px;font-size:15px;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>button.DTTT_button,.input-group-btn:first-child>div.DTTT_button,.input-group-btn:first-child>a.DTTT_button,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.btn-group>button.DTTT_button,.input-group-btn:first-child>.btn-group>div.DTTT_button,.input-group-btn:first-child>.btn-group>a.DTTT_button,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>button.DTTT_button:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>div.DTTT_button:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>a.DTTT_button:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn-group:not(:last-child)>button.DTTT_button,.input-group-btn:last-child>.btn-group:not(:last-child)>div.DTTT_button,.input-group-btn:last-child>.btn-group:not(:last-child)>a.DTTT_button{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>button.DTTT_button,.input-group-btn:last-child>div.DTTT_button,.input-group-btn:last-child>a.DTTT_button,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.btn-group>button.DTTT_button,.input-group-btn:last-child>.btn-group>div.DTTT_button,.input-group-btn:last-child>.btn-group>a.DTTT_button,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>button.DTTT_button:not(:first-child),.input-group-btn:first-child>div.DTTT_button:not(:first-child),.input-group-btn:first-child>a.DTTT_button:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn-group:not(:first-child)>button.DTTT_button,.input-group-btn:first-child>.btn-group:not(:first-child)>div.DTTT_button,.input-group-btn:first-child>.btn-group:not(:first-child)>a.DTTT_button{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn,.input-group-btn>button.DTTT_button,.input-group-btn>div.DTTT_button,.input-group-btn>a.DTTT_button{position:relative}.input-group-btn>.btn+.btn,.input-group-btn>button.DTTT_button+.btn,.input-group-btn>div.DTTT_button+.btn,.input-group-btn>a.DTTT_button+.btn,.input-group-btn>.btn+button.DTTT_button,.input-group-btn>button.DTTT_button+button.DTTT_button,.input-group-btn>div.DTTT_button+button.DTTT_button,.input-group-btn>a.DTTT_button+button.DTTT_button,.input-group-btn>.btn+div.DTTT_button,.input-group-btn>button.DTTT_button+div.DTTT_button,.input-group-btn>div.DTTT_button+div.DTTT_button,.input-group-btn>a.DTTT_button+div.DTTT_button,.input-group-btn>.btn+a.DTTT_button,.input-group-btn>button.DTTT_button+a.DTTT_button,.input-group-btn>div.DTTT_button+a.DTTT_button,.input-group-btn>a.DTTT_button+a.DTTT_button{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>button.DTTT_button:hover,.input-group-btn>div.DTTT_button:hover,.input-group-btn>a.DTTT_button:hover,.input-group-btn>.btn:focus,.input-group-btn>button.DTTT_button:focus,.input-group-btn>div.DTTT_button:focus,.input-group-btn>a.DTTT_button:focus,.input-group-btn>.btn:active,.input-group-btn>button.DTTT_button:active,.input-group-btn>div.DTTT_button:active,.input-group-btn>a.DTTT_button:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>button.DTTT_button,.input-group-btn:first-child>div.DTTT_button,.input-group-btn:first-child>a.DTTT_button,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>button.DTTT_button,.input-group-btn:last-child>div.DTTT_button,.input-group-btn:last-child>a.DTTT_button,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:before,.nav:after{content:" ";display:table}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:5px 6px 5px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#63676a}.nav>li.disabled>a{color:#63676a}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#63676a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#63676a;border-color:#375959}.nav .nav-divider{height:1px;margin:5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #adadad}.nav-tabs>li{float:left;margin-bottom:-1px;margin-right:2px}.nav-tabs>li>a{line-height:1.5;border:1px solid transparent}.nav-tabs>li>a:hover{border-color:#adadad #adadad #adadad}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#313335;border:1px solid #adadad;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0px}.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:#375959}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 780px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0px}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 780px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:0px 0px 0 0}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#313335}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:30px;margin-bottom:18px}.navbar:before,.navbar:after{content:" ";display:table}.navbar:after{clear:both}@media (min-width: 780px){.navbar{border-radius:0px}}.navbar-header:before,.navbar-header:after{content:" ";display:table}.navbar-header:after{clear:both}@media (min-width: 780px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:10px;padding-left:10px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media (min-width: 780px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:-10px;margin-left:-10px}@media (min-width: 780px){.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width: 780px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width: 780px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:6px 10px;font-size:15px;line-height:18px;height:30px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width: 780px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-10px}}.navbar-toggle{position:relative;float:right;margin-right:10px;margin-left:10px;padding:6px 12px;margin-top:-2px;margin-bottom:-2px;background-color:#adadad;background-image:none;border:1px solid #a0a0a0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}.navbar-toggle:focus{outline:none}.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: 780px){.navbar-toggle{display:none}}.navbar-nav{margin:3px -10px;float:left;margin:0}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width: 779px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:18px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}.navbar-nav>li{float:left;margin-right:2px}.navbar-nav>li>a{padding-top:6px;padding-bottom:6px}.navbar-nav.navbar-right:last-child{margin-right:-10px}@media (min-width: 780px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-10px;margin-right:-10px;padding:10px 10px;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:-1px;margin-bottom:-1px}@media (max-width: 779px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width: 780px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-10px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:-1px;margin-bottom:-1px}.navbar-btn.btn-sm,.btn-group-sm>.navbar-btn.btn,button.navbar-btn.DTTT_button,div.navbar-btn.DTTT_button,a.navbar-btn.DTTT_button{margin-top:1px;margin-bottom:1px}.navbar-btn.btn-xs,.btn-group-xs>.navbar-btn.btn,.btn-group-xs>button.navbar-btn.DTTT_button,.btn-group-xs>div.navbar-btn.DTTT_button,.btn-group-xs>a.navbar-btn.DTTT_button{margin-top:4px;margin-bottom:4px}.navbar-text{margin-top:6px;margin-bottom:6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;float:left;margin-left:10px;margin-right:10px}.navbar-text.navbar-right:last-child{margin-right:0}.navbar-default{background:rgba(43,43,43,0.9);border-color:none;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#568a89;background-color:transparent}.navbar-default .navbar-text{color:#63676a}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#1d1d1d;background-color:#63676a}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#2b2b2b;background-color:#adadad}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#a0a0a0;color:#2b2b2b}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#bababa}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:none}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#adadad;color:#2b2b2b}@media (max-width: 779px){.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:#1d1d1d;background-color:#63676a}.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:#2b2b2b;background-color:#adadad}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#1d1d1d}.navbar-inverse{background-color:#222;border-color:#090909}.navbar-inverse .navbar-brand{color:#63676a}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#63676a}.navbar-inverse .navbar-nav>li>a{color:#63676a}.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:#090909}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#090909;color:#fff}@media (max-width: 779px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#63676a}.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:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#63676a}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:0px 0px;margin-bottom:18px;list-style:none;background-color:none;border-radius:0px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/Ā ";padding:0 5px;color:#63676a}.breadcrumb>.active{color:#5cb85c}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:0px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.5;text-decoration:none;color:#375959;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0px;border-top-left-radius:0px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0px;border-top-right-radius:0px}.pagination>li>a:hover,.pagination>li>a:focus,.pagination>li>span:hover,.pagination>li>span:focus{color:#1a2a2a;background-color:#adadad;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:hover,.pagination>.active>a:focus,.pagination>.active>span,.pagination>.active>span:hover,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#375959;border-color:#375959;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#63676a;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:15px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:11px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:18px 0;list-style:none;text-align:center}.pager:before,.pager:after{content:" ";display:table}.pager:after{clear:both}.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:#adadad}.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:#63676a;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:2px 5px;font-size:75%;font-weight:bold;line-height:1;color:#1d1d1d;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:3px}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label,button.DTTT_button .label,div.DTTT_button .label,a.DTTT_button .label{position:relative;top:-1px}.label-default{background-color:#63676a}.label-default[href]:hover,.label-default[href]:focus{background-color:#4a4d50}.label-primary{background-color:#375959}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#243939}.label-success{background-color:#4f9e4f}.label-success[href]:hover,.label-success[href]:focus{background-color:#3e7c3e}.label-info{background-color:#316490}.label-info[href]:hover,.label-info[href]:focus{background-color:#244a6a}.label-warning{background-color:#e28a0d}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#b26d0a}.label-danger{background-color:#a52521}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#7b1b18}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:11px;font-weight:bold;color:#eaeaea;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#63676a;border-radius:10px}.badge:empty{display:none}.btn .badge,button.DTTT_button .badge,div.DTTT_button .badge,a.DTTT_button .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge,.btn-group-xs>button.DTTT_button .badge,.btn-group-xs>div.DTTT_button .badge,.btn-group-xs>a.DTTT_button .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#375959;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#adadad}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:18px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width: 780px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:54px}}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.5;background-color:#313335;border:1px solid #ddd;border-radius:0px;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#63676a}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#375959}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:0px}.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{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#d1e8d1;border-color:#4f9e4f;color:#2b2b2b}.alert-success hr{border-top-color:#478d47}.alert-success .alert-link{color:#121212}.alert-info{background-color:#abc9e2;border-color:#316490;color:#2b2b2b}.alert-info hr{border-top-color:#2b577d}.alert-info .alert-link{color:#121212}.alert-warning{background-color:#fef8f0;border-color:#e28a0d;color:#2b2b2b}.alert-warning hr{border-top-color:#ca7b0c}.alert-warning .alert-link{color:#121212}.alert-danger{background-color:#f6d1d0;border-color:#a52521;color:#2b2b2b}.alert-danger hr{border-top-color:#90201d}.alert-danger .alert-link{color:#121212}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f5f5f5;border-radius:0px;-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:11px;line-height:18px;color:#fff;text-align:center;background-color:#375959;-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;transition:width 0.6s ease}.progress-striped .progress-bar{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:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#4f9e4f}.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:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-info{background-color:#316490}.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:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-warning{background-color:#e28a0d}.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:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-danger{background-color:#a52521}.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:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:6px 8px;background-color:#adadad;border-bottom:1px solid #63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.list-group-item:first-child{border-top-right-radius:0px;border-top-left-radius:0px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0px;border-bottom-left-radius:0px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#63676a;color:#1d1d1d}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#eaeaea;background-color:#375959;border-color:#375959}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#9bc1c1}.list-group-item-success{color:#2b2b2b;background-color:#d1e8d1}a.list-group-item-success{color:#2b2b2b}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#2b2b2b;background-color:#c0e0c0}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-info{color:#2b2b2b;background-color:#abc9e2}a.list-group-item-info{color:#2b2b2b}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#2b2b2b;background-color:#98bcdc}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-warning{color:#2b2b2b;background-color:#fef8f0}a.list-group-item-warning{color:#2b2b2b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#2b2b2b;background-color:#fdedd8}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-danger{color:#2b2b2b;background-color:#f6d1d0}a.list-group-item-danger{color:#2b2b2b}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#2b2b2b;background-color:#f1bcba}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:0px;-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-body:before,.panel-body:after{content:" ";display:table}.panel-body:after{clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1px;border-top-left-radius:-1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:14px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1px;border-top-left-radius:-1px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1px;border-top-left-radius:-1px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:-1px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:-1px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:-1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:-1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #313335}.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-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th: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-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th: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-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:0px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#313335;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#375959}.panel-primary>.panel-heading{color:#fff;background-color:#375959;border-color:#375959}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#375959}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#375959}.panel-success{border-color:#4f9e4f}.panel-success>.panel-heading{color:#2b2b2b;background-color:#d1e8d1;border-color:#4f9e4f}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#4f9e4f}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#4f9e4f}.panel-info{border-color:#316490}.panel-info>.panel-heading{color:#2b2b2b;background-color:#abc9e2;border-color:#316490}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#316490}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#316490}.panel-warning{border-color:#e28a0d}.panel-warning>.panel-heading{color:#2b2b2b;background-color:#fef8f0;border-color:#e28a0d}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#e28a0d}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#e28a0d}.panel-danger{border-color:#a52521}.panel-danger>.panel-heading{color:#2b2b2b;background-color:#f6d1d0;border-color:#a52521}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#a52521}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#a52521}.well{min-height:20px;padding:10px;margin-bottom:20px;background-color:#63676a;border:1px solid #313335;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;color:#2b2b2b;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well a{color:#6caead}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:18px;font-weight:bold;line-height:1;color:#a52521}.close:hover,.close:focus{color:#a52521;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}.modal-dialog{position:relative;width:auto;margin:10px;z-index:1050}.modal-content{position:relative;background-color:#3c3f41;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);background-clip:padding-box;outline:none}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:14px;border-bottom:1px solid #303234;min-height:15.5px;background-color:#353739}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:14px;color:#adadad}.modal-footer{padding:13px 14px 14px;text-align:right;border-top:1px solid #303234;background-color:#353739}.modal-footer:before,.modal-footer:after{content:" ";display:table}.modal-footer:after{clear:both}.modal-footer .btn+.btn,.modal-footer button.DTTT_button+.btn,.modal-footer div.DTTT_button+.btn,.modal-footer a.DTTT_button+.btn,.modal-footer .btn+button.DTTT_button,.modal-footer button.DTTT_button+button.DTTT_button,.modal-footer div.DTTT_button+button.DTTT_button,.modal-footer a.DTTT_button+button.DTTT_button,.modal-footer .btn+div.DTTT_button,.modal-footer button.DTTT_button+div.DTTT_button,.modal-footer div.DTTT_button+div.DTTT_button,.modal-footer a.DTTT_button+div.DTTT_button,.modal-footer .btn+a.DTTT_button,.modal-footer button.DTTT_button+a.DTTT_button,.modal-footer div.DTTT_button+a.DTTT_button,.modal-footer a.DTTT_button+a.DTTT_button{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn,.modal-footer .btn-group button.DTTT_button+.btn,.modal-footer .btn-group div.DTTT_button+.btn,.modal-footer .btn-group a.DTTT_button+.btn,.modal-footer .btn-group .btn+button.DTTT_button,.modal-footer .btn-group button.DTTT_button+button.DTTT_button,.modal-footer .btn-group div.DTTT_button+button.DTTT_button,.modal-footer .btn-group a.DTTT_button+button.DTTT_button,.modal-footer .btn-group .btn+div.DTTT_button,.modal-footer .btn-group button.DTTT_button+div.DTTT_button,.modal-footer .btn-group div.DTTT_button+div.DTTT_button,.modal-footer .btn-group a.DTTT_button+div.DTTT_button,.modal-footer .btn-group .btn+a.DTTT_button,.modal-footer .btn-group button.DTTT_button+a.DTTT_button,.modal-footer .btn-group div.DTTT_button+a.DTTT_button,.modal-footer .btn-group a.DTTT_button+a.DTTT_button{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width: 780px){.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: 1200px){.modal-lg>.modal-dialog{width:820px}}.tooltip{position:absolute;z-index:1010;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:0px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.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{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right: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;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1030;display:none;max-width:276px;padding:1px;text-align:left;background-color:#3c3f41;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:12px;font-weight:normal;line-height:18px;background-color:#353739;border-bottom:1px solid #282a2c;border-radius:5px 5px 0 0;color:#63676a}.popover-content{padding:7px 10px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#63676a}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#63676a}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#63676a}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#63676a;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.5) 0%), color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0%,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.0001) 0%), color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0%,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:none;color:#fff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.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}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn,.carousel-caption button.DTTT_button,.carousel-caption div.DTTT_button,.carousel-caption a.DTTT_button{text-shadow:none}@media screen and (min-width: 780px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}@media (max-width: 779px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (min-width: 780px) and (max-width: 1199px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width: 1200px) and (max-width: 1599px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width: 1600px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (max-width: 779px){.hidden-xs{display:none !important}}@media (min-width: 780px) and (max-width: 1199px){.hidden-sm{display:none !important}}@media (min-width: 1200px) and (max-width: 1599px){.hidden-md{display:none !important}}@media (min-width: 1600px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}@media print{.hidden-print{display:none !important}}/*! + */*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:transparent}body{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:1.5;color:#63676a;background-color:#313335}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#375959;text-decoration:none}a:hover,a:focus{color:#1a2a2a;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;text-decoration:none}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#313335;border:1px solid #ddd;border-radius:0px;-webkit-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:18px;margin-bottom:18px;border:0;border-top:1px solid #adadad}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;line-height:1.1;color:inherit}h1 small,h1 .small,h2 small,h2 .small,h3 small,h3 .small,h4 small,h4 .small,h5 small,h5 .small,h6 small,h6 .small,.h1 small,.h1 .small,.h2 small,.h2 .small,.h3 small,.h3 .small,.h4 small,.h4 .small,.h5 small,.h5 .small,.h6 small,.h6 .small{font-weight:normal;line-height:1;color:#63676a}h1,.h1,h2,.h2,h3,.h3{margin-top:18px;margin-bottom:9px}h1 small,h1 .small,.h1 small,.h1 .small,h2 small,h2 .small,.h2 small,.h2 .small,h3 small,h3 .small,.h3 small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:9px;margin-bottom:9px}h4 small,h4 .small,.h4 small,.h4 .small,h5 small,h5 .small,.h5 small,.h5 .small,h6 small,h6 .small,.h6 small,.h6 .small{font-size:75%}h1,.h1{font-size:22px}h2,.h2{font-size:14px}h3,.h3{font-size:17px}h4,.h4{font-size:12px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:13px;font-weight:200;line-height:1.4}@media (min-width: 780px){.lead{font-size:18px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#63676a}.text-primary{color:#375959}a.text-primary:hover{color:#243939}.text-success{color:#2b2b2b}a.text-success:hover{color:#121212}.text-info{color:#2b2b2b}a.text-info:hover{color:#121212}.text-warning{color:#2b2b2b}a.text-warning:hover{color:#121212}.text-danger{color:#2b2b2b}a.text-danger:hover{color:#121212}.bg-primary{color:#fff}.bg-primary{background-color:#375959}a.bg-primary:hover{background-color:#243939}.bg-success{background-color:#d1e8d1}a.bg-success:hover{background-color:#afd7af}.bg-info{background-color:#abc9e2}a.bg-info:hover{background-color:#85b0d5}.bg-warning{background-color:#fef8f0}a.bg-warning:hover{background-color:#fbe3c0}.bg-danger{background-color:#f6d1d0}a.bg-danger:hover{background-color:#eda7a5}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #adadad}ul,ol{margin-top:0;margin-bottom:9px}ul ul,ul ol,ol ul,ol ol{margin-bottom:0}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dt,dd{line-height:1.5}dt{font-weight:bold}dd{margin-left:0}@media (min-width: 780px){.dl-horizontal dt{float:left;width:80px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:100px}.dl-horizontal dd:before,.dl-horizontal dd:after{content:" ";display:table}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #63676a}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:9px 18px;margin:0 0 18px;font-size:15px;border-left:5px solid #5cb85c}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.5;color:#63676a}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #5cb85c;border-left:0;text-align:right}.blockquote-reverse footer:before,.blockquote-reverse small:before,.blockquote-reverse .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,.blockquote-reverse small:after,.blockquote-reverse .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:18px;font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:0px}kbd{padding:2px 4px;font-size:90%;color:#adadad;background-color:#2b2b2b;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#313335;background-color:#f5f5f5;border:1px solid #ccc;border-radius:0px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:10px;padding-right:10px}.container:before,.container:after{content:" ";display:table}.container:after{clear:both}@media (min-width: 780px){.container{width:740px}}@media (min-width: 1200px){.container{width:960px}}@media (min-width: 1600px){.container{width:1160px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:10px;padding-right:10px}.container-fluid:before,.container-fluid:after{content:" ";display:table}.container-fluid:after{clear:both}.row{margin-left:-10px;margin-right:-10px}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:10px;padding-right:10px}.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-1{width:8.3333333333%}.col-xs-2{width:16.6666666667%}.col-xs-3{width:25%}.col-xs-4{width:33.3333333333%}.col-xs-5{width:41.6666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.3333333333%}.col-xs-8{width:66.6666666667%}.col-xs-9{width:75%}.col-xs-10{width:83.3333333333%}.col-xs-11{width:91.6666666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:0%}.col-xs-pull-1{right:8.3333333333%}.col-xs-pull-2{right:16.6666666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.3333333333%}.col-xs-pull-5{right:41.6666666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.3333333333%}.col-xs-pull-8{right:66.6666666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.3333333333%}.col-xs-pull-11{right:91.6666666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:0%}.col-xs-push-1{left:8.3333333333%}.col-xs-push-2{left:16.6666666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.3333333333%}.col-xs-push-5{left:41.6666666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.3333333333%}.col-xs-push-8{left:66.6666666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.3333333333%}.col-xs-push-11{left:91.6666666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0%}.col-xs-offset-1{margin-left:8.3333333333%}.col-xs-offset-2{margin-left:16.6666666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.3333333333%}.col-xs-offset-5{margin-left:41.6666666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.3333333333%}.col-xs-offset-8{margin-left:66.6666666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.3333333333%}.col-xs-offset-11{margin-left:91.6666666667%}.col-xs-offset-12{margin-left:100%}@media (min-width: 780px){.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-1{width:8.3333333333%}.col-sm-2{width:16.6666666667%}.col-sm-3{width:25%}.col-sm-4{width:33.3333333333%}.col-sm-5{width:41.6666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.3333333333%}.col-sm-8{width:66.6666666667%}.col-sm-9{width:75%}.col-sm-10{width:83.3333333333%}.col-sm-11{width:91.6666666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:0%}.col-sm-pull-1{right:8.3333333333%}.col-sm-pull-2{right:16.6666666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.3333333333%}.col-sm-pull-5{right:41.6666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.3333333333%}.col-sm-pull-8{right:66.6666666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.3333333333%}.col-sm-pull-11{right:91.6666666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:0%}.col-sm-push-1{left:8.3333333333%}.col-sm-push-2{left:16.6666666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.3333333333%}.col-sm-push-5{left:41.6666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.3333333333%}.col-sm-push-8{left:66.6666666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.3333333333%}.col-sm-push-11{left:91.6666666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0%}.col-sm-offset-1{margin-left:8.3333333333%}.col-sm-offset-2{margin-left:16.6666666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.3333333333%}.col-sm-offset-5{margin-left:41.6666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.3333333333%}.col-sm-offset-8{margin-left:66.6666666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.3333333333%}.col-sm-offset-11{margin-left:91.6666666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width: 1200px){.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-1{width:8.3333333333%}.col-md-2{width:16.6666666667%}.col-md-3{width:25%}.col-md-4{width:33.3333333333%}.col-md-5{width:41.6666666667%}.col-md-6{width:50%}.col-md-7{width:58.3333333333%}.col-md-8{width:66.6666666667%}.col-md-9{width:75%}.col-md-10{width:83.3333333333%}.col-md-11{width:91.6666666667%}.col-md-12{width:100%}.col-md-pull-0{right:0%}.col-md-pull-1{right:8.3333333333%}.col-md-pull-2{right:16.6666666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.3333333333%}.col-md-pull-5{right:41.6666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.3333333333%}.col-md-pull-8{right:66.6666666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.3333333333%}.col-md-pull-11{right:91.6666666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:0%}.col-md-push-1{left:8.3333333333%}.col-md-push-2{left:16.6666666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.3333333333%}.col-md-push-5{left:41.6666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.3333333333%}.col-md-push-8{left:66.6666666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.3333333333%}.col-md-push-11{left:91.6666666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0%}.col-md-offset-1{margin-left:8.3333333333%}.col-md-offset-2{margin-left:16.6666666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.3333333333%}.col-md-offset-5{margin-left:41.6666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.3333333333%}.col-md-offset-8{margin-left:66.6666666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.3333333333%}.col-md-offset-11{margin-left:91.6666666667%}.col-md-offset-12{margin-left:100%}}@media (min-width: 1600px){.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-1{width:8.3333333333%}.col-lg-2{width:16.6666666667%}.col-lg-3{width:25%}.col-lg-4{width:33.3333333333%}.col-lg-5{width:41.6666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.3333333333%}.col-lg-8{width:66.6666666667%}.col-lg-9{width:75%}.col-lg-10{width:83.3333333333%}.col-lg-11{width:91.6666666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:0%}.col-lg-pull-1{right:8.3333333333%}.col-lg-pull-2{right:16.6666666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.3333333333%}.col-lg-pull-5{right:41.6666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.3333333333%}.col-lg-pull-8{right:66.6666666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.3333333333%}.col-lg-pull-11{right:91.6666666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:0%}.col-lg-push-1{left:8.3333333333%}.col-lg-push-2{left:16.6666666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.3333333333%}.col-lg-push-5{left:41.6666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.3333333333%}.col-lg-push-8{left:66.6666666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.3333333333%}.col-lg-push-11{left:91.6666666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0%}.col-lg-offset-1{margin-left:8.3333333333%}.col-lg-offset-2{margin-left:16.6666666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.3333333333%}.col-lg-offset-5{margin-left:41.6666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.3333333333%}.col-lg-offset-8{margin-left:66.6666666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.3333333333%}.col-lg-offset-11{margin-left:91.6666666667%}.col-lg-offset-12{margin-left:100%}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:0;border-spacing:0}.table>thead>tr>th,.table>thead>tr>td,.table>tbody>tr>th,.table>tbody>tr>td,.table>tfoot>tr>th,.table>tfoot>tr>td{padding:8px;line-height:1.5;vertical-align:top;border-top:1px solid #313335}.table>thead>tr>th{vertical-align:bottom;border-bottom:0px solid #313335}.table>caption+thead>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>th,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #313335}.table .table{background-color:#313335}.table-condensed>thead>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>tfoot>tr>td{padding:2px}.table-bordered{border:1px solid #313335}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>td{border:1px solid #313335}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#ecf3f8}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>thead>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th{background-color:#ecf3f8}.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.active:hover>th{background-color:#d9e7f1}.table>thead>tr>td.success,.table>thead>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th{background-color:#d1e8d1}.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.success:hover>th{background-color:#c0e0c0}.table>thead>tr>td.info,.table>thead>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th{background-color:#abc9e2}.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.info:hover>th{background-color:#98bcdc}.table>thead>tr>td.warning,.table>thead>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th{background-color:#fef8f0}.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.warning:hover>th{background-color:#fdedd8}.table>thead>tr>td.danger,.table>thead>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th{background-color:#f6d1d0}.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.danger:hover>th{background-color:#f1bcba}@media (max-width: 779px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #313335;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>th,.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>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th: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>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th: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>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:18px;line-height:inherit;color:#313335;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:12px;line-height:1.5;color:#adadad}.form-control{display:block;width:100%;height:32px;padding:6px 12px;font-size:12px;line-height:1.5;color:#adadad;background-color:#313335;background-image:none;border:1px solid #63676a;border-radius:0px;-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 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.form-control:focus{border-color:#568a89;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(86,138,137,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(86,138,137,0.6)}.form-control::-moz-placeholder{color:#63676a;opacity:1}.form-control:-ms-input-placeholder{color:#63676a}.form-control::-webkit-input-placeholder{color:#63676a}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#adadad;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"]{line-height:32px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:18px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],fieldset[disabled] input[type="checkbox"],.radio[disabled],fieldset[disabled] .radio,.radio-inline[disabled],fieldset[disabled] .radio-inline,.checkbox[disabled],fieldset[disabled] .checkbox,.checkbox-inline[disabled],fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-group-sm>.input-group-btn>button.DTTT_button,.input-group-sm>.input-group-btn>div.DTTT_button,.input-group-sm>.input-group-btn>a.DTTT_button{height:28px;padding:5px 10px;font-size:11px;line-height:1.5;border-radius:3px}select.input-sm,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,.input-group-sm>.input-group-btn>select.btn{height:28px;line-height:28px}textarea.input-sm,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,.input-group-sm>.input-group-btn>textarea.btn,select[multiple].input-sm,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>.input-group-btn>select[multiple].btn{height:auto}.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-group-lg>.input-group-btn>button.DTTT_button,.input-group-lg>.input-group-btn>div.DTTT_button,.input-group-lg>.input-group-btn>a.DTTT_button{height:42px;padding:10px 16px;font-size:15px;line-height:1.33;border-radius:6px}select.input-lg,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,.input-group-lg>.input-group-btn>select.btn{height:42px;line-height:42px}textarea.input-lg,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,.input-group-lg>.input-group-btn>textarea.btn,select[multiple].input-lg,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>.input-group-btn>select[multiple].btn{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.has-feedback .form-control-feedback{position:absolute;top:23px;right:0;display:block;width:32px;height:32px;line-height:32px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#2b2b2b}.has-success .form-control{border-color:#2b2b2b;-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{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e}.has-success .select2-selection{border:1px solid !important;border-color:#2b2b2b !important;-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 .input-group-addon{color:#2b2b2b;border-color:#2b2b2b;background-color:#d1e8d1}.has-success .form-control-feedback{color:#2b2b2b}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#2b2b2b}.has-warning .form-control{border-color:#2b2b2b;-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{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e}.has-warning .select2-selection{border:1px solid !important;border-color:#2b2b2b !important;-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 .input-group-addon{color:#2b2b2b;border-color:#2b2b2b;background-color:#fef8f0}.has-warning .form-control-feedback{color:#2b2b2b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#d9534f}.has-error .form-control{border-color:#d9534f;-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{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3}.has-error .select2-selection{border:1px solid !important;border-color:#d9534f !important;-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 .input-group-addon{color:#d9534f;border-color:#d9534f;background-color:#f6d1d0}.has-error .form-control-feedback{color:#d9534f}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#7c8184}@media (min-width: 780px){.form-inline .form-group,.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control,.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control,.navbar-form .input-group>.form-control{width:100%}.form-inline .control-label,.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.navbar-form .radio,.form-inline .checkbox,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type="radio"],.navbar-form .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback,.navbar-form .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:25px}.form-horizontal .form-group{margin-left:-10px;margin-right:-10px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{content:" ";display:table}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media (min-width: 780px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:10px}.btn,button.DTTT_button,div.DTTT_button,a.DTTT_button{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:12px;line-height:1.5;border-radius:0px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,button.DTTT_button:focus,div.DTTT_button:focus,a.DTTT_button:focus,.btn:active:focus,button.DTTT_button:active:focus,div.DTTT_button:active:focus,a.DTTT_button:active:focus,.btn.active:focus,button.active.DTTT_button:focus,div.active.DTTT_button:focus,a.active.DTTT_button:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,button.DTTT_button:hover,div.DTTT_button:hover,a.DTTT_button:hover,.btn:focus,button.DTTT_button:focus,div.DTTT_button:focus,a.DTTT_button:focus{color:#eaeaea;text-decoration:none}.btn:active,button.DTTT_button:active,div.DTTT_button:active,a.DTTT_button:active,.btn.active,button.active.DTTT_button,div.active.DTTT_button,a.active.DTTT_button{outline:0;background-image:none;-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,button.disabled.DTTT_button,div.disabled.DTTT_button,a.disabled.DTTT_button,.btn[disabled],button[disabled].DTTT_button,div[disabled].DTTT_button,a[disabled].DTTT_button,fieldset[disabled] .btn,fieldset[disabled] button.DTTT_button,fieldset[disabled] div.DTTT_button,fieldset[disabled] a.DTTT_button{cursor:not-allowed;pointer-events:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default,button.DTTT_button,div.DTTT_button,a.DTTT_button{color:#eaeaea;background-color:#63676a;border-color:#575a5d}.btn-default:hover,button.DTTT_button:hover,div.DTTT_button:hover,a.DTTT_button:hover,.btn-default:focus,button.DTTT_button:focus,div.DTTT_button:focus,a.DTTT_button:focus,.btn-default:active,button.DTTT_button:active,div.DTTT_button:active,a.DTTT_button:active,.btn-default.active,button.active.DTTT_button,div.active.DTTT_button,a.active.DTTT_button{color:#eaeaea;background-color:#777b7f;border-color:#74797c}.open .btn-default.dropdown-toggle,.open button.dropdown-toggle.DTTT_button,.open div.dropdown-toggle.DTTT_button,.open a.dropdown-toggle.DTTT_button{color:#eaeaea;background-color:#777b7f;border-color:#74797c}.btn-default:active,button.DTTT_button:active,div.DTTT_button:active,a.DTTT_button:active,.btn-default.active,button.active.DTTT_button,div.active.DTTT_button,a.active.DTTT_button{background-image:none}.open .btn-default.dropdown-toggle,.open button.dropdown-toggle.DTTT_button,.open div.dropdown-toggle.DTTT_button,.open a.dropdown-toggle.DTTT_button{background-image:none}.btn-default.disabled,button.disabled.DTTT_button,div.disabled.DTTT_button,a.disabled.DTTT_button,.btn-default.disabled:hover,button.disabled.DTTT_button:hover,div.disabled.DTTT_button:hover,a.disabled.DTTT_button:hover,.btn-default.disabled:focus,button.disabled.DTTT_button:focus,div.disabled.DTTT_button:focus,a.disabled.DTTT_button:focus,.btn-default.disabled:active,button.disabled.DTTT_button:active,div.disabled.DTTT_button:active,a.disabled.DTTT_button:active,.btn-default.disabled.active,button.disabled.active.DTTT_button,div.disabled.active.DTTT_button,a.disabled.active.DTTT_button,.btn-default[disabled],button[disabled].DTTT_button,div[disabled].DTTT_button,a[disabled].DTTT_button,.btn-default[disabled]:hover,button[disabled].DTTT_button:hover,div[disabled].DTTT_button:hover,a[disabled].DTTT_button:hover,.btn-default[disabled]:focus,button[disabled].DTTT_button:focus,div[disabled].DTTT_button:focus,a[disabled].DTTT_button:focus,.btn-default[disabled]:active,button[disabled].DTTT_button:active,div[disabled].DTTT_button:active,a[disabled].DTTT_button:active,.btn-default[disabled].active,button[disabled].active.DTTT_button,div[disabled].active.DTTT_button,a[disabled].active.DTTT_button,fieldset[disabled] .btn-default,fieldset[disabled] button.DTTT_button,fieldset[disabled] div.DTTT_button,fieldset[disabled] a.DTTT_button,fieldset[disabled] .btn-default:hover,fieldset[disabled] button.DTTT_button:hover,fieldset[disabled] div.DTTT_button:hover,fieldset[disabled] a.DTTT_button:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] button.DTTT_button:focus,fieldset[disabled] div.DTTT_button:focus,fieldset[disabled] a.DTTT_button:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] button.DTTT_button:active,fieldset[disabled] div.DTTT_button:active,fieldset[disabled] a.DTTT_button:active,fieldset[disabled] .btn-default.active,fieldset[disabled] button.active.DTTT_button,fieldset[disabled] div.active.DTTT_button,fieldset[disabled] a.active.DTTT_button{background-color:#63676a;border-color:#575a5d}.btn-default .badge,button.DTTT_button .badge,div.DTTT_button .badge,a.DTTT_button .badge{color:#63676a;background-color:#eaeaea}.btn-primary{color:#eaeaea;background-color:#375959;border-color:#2d4949}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active{color:#eaeaea;background-color:#477272;border-color:#456f6f}.open .btn-primary.dropdown-toggle{color:#eaeaea;background-color:#477272;border-color:#456f6f}.btn-primary:active,.btn-primary.active{background-image:none}.open .btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled,.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled:active,.btn-primary.disabled.active,.btn-primary[disabled],.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled]:active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary.active{background-color:#375959;border-color:#2d4949}.btn-primary .badge{color:#375959;background-color:#eaeaea}.btn-success{color:#eaeaea;background-color:#4f9e4f;border-color:#478d47}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active{color:#eaeaea;background-color:#64b264;border-color:#61b061}.open .btn-success.dropdown-toggle{color:#eaeaea;background-color:#64b264;border-color:#61b061}.btn-success:active,.btn-success.active{background-image:none}.open .btn-success.dropdown-toggle{background-image:none}.btn-success.disabled,.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled:active,.btn-success.disabled.active,.btn-success[disabled],.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled]:active,.btn-success[disabled].active,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success.active{background-color:#4f9e4f;border-color:#478d47}.btn-success .badge{color:#4f9e4f;background-color:#eaeaea}.btn-info{color:#eaeaea;background-color:#316490;border-color:#2b577d}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active{color:#eaeaea;background-color:#3b79ae;border-color:#3a76ab}.open .btn-info.dropdown-toggle{color:#eaeaea;background-color:#3b79ae;border-color:#3a76ab}.btn-info:active,.btn-info.active{background-image:none}.open .btn-info.dropdown-toggle{background-image:none}.btn-info.disabled,.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled:active,.btn-info.disabled.active,.btn-info[disabled],.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled]:active,.btn-info[disabled].active,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info.active{background-color:#316490;border-color:#2b577d}.btn-info .badge{color:#316490;background-color:#eaeaea}.btn-warning{color:#eaeaea;background-color:#e28a0d;border-color:#ca7b0c}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active{color:#eaeaea;background-color:#f29e25;border-color:#f29c20}.open .btn-warning.dropdown-toggle{color:#eaeaea;background-color:#f29e25;border-color:#f29c20}.btn-warning:active,.btn-warning.active{background-image:none}.open .btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled,.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled:active,.btn-warning.disabled.active,.btn-warning[disabled],.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled]:active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning.active{background-color:#e28a0d;border-color:#ca7b0c}.btn-warning .badge{color:#e28a0d;background-color:#eaeaea}.btn-danger{color:#eaeaea;background-color:#a52521;border-color:#90201d}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active{color:#eaeaea;background-color:#c72d28;border-color:#c32c27}.open .btn-danger.dropdown-toggle{color:#eaeaea;background-color:#c72d28;border-color:#c32c27}.btn-danger:active,.btn-danger.active{background-image:none}.open .btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled,.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled:active,.btn-danger.disabled.active,.btn-danger[disabled],.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled]:active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger.active{background-color:#a52521;border-color:#90201d}.btn-danger .badge{color:#a52521;background-color:#eaeaea}.btn-link{color:#375959;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#1a2a2a;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus{color:#63676a;text-decoration:none}.btn-lg,.btn-group-lg>.btn,.btn-group-lg>button.DTTT_button,.btn-group-lg>div.DTTT_button,.btn-group-lg>a.DTTT_button{padding:10px 16px;font-size:15px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn,.btn-group-sm>button.DTTT_button,.btn-group-sm>div.DTTT_button,.btn-group-sm>a.DTTT_button,button.DTTT_button,div.DTTT_button,a.DTTT_button{padding:5px 10px;font-size:11px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn,.btn-group-xs>button.DTTT_button,.btn-group-xs>div.DTTT_button,.btn-group-xs>a.DTTT_button{padding:1px 5px;font-size:11px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.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;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;transition:height 0.35s ease}@font-face{font-family:'Glyphicons Halflings';src:url("../fonts/glyphicons-halflings-regular.eot");src:url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/glyphicons-halflings-regular.woff") format("woff"),url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"),url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.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;list-style:none;font-size:12px;background-color:#adadad;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:0px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4);background-clip:padding-box;border-radius:5px}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#63676a}.dropdown-menu>li>a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:1.5;color:#313335;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#1d1d1d;background-color:#63676a}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#adadad;text-decoration:none;outline:0;background-color:#375959}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#63676a}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:11px;line-height:1.5;color:#63676a}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width: 780px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group>button.DTTT_button,.btn-group>div.DTTT_button,.btn-group>a.DTTT_button,.btn-group-vertical>.btn,.btn-group-vertical>button.DTTT_button,.btn-group-vertical>div.DTTT_button,.btn-group-vertical>a.DTTT_button{position:relative;float:left}.btn-group>.btn:hover,.btn-group>button.DTTT_button:hover,.btn-group>div.DTTT_button:hover,.btn-group>a.DTTT_button:hover,.btn-group>.btn:focus,.btn-group>button.DTTT_button:focus,.btn-group>div.DTTT_button:focus,.btn-group>a.DTTT_button:focus,.btn-group>.btn:active,.btn-group>button.DTTT_button:active,.btn-group>div.DTTT_button:active,.btn-group>a.DTTT_button:active,.btn-group>.btn.active,.btn-group>button.active.DTTT_button,.btn-group>div.active.DTTT_button,.btn-group>a.active.DTTT_button,.btn-group-vertical>.btn:hover,.btn-group-vertical>button.DTTT_button:hover,.btn-group-vertical>div.DTTT_button:hover,.btn-group-vertical>a.DTTT_button:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>button.DTTT_button:focus,.btn-group-vertical>div.DTTT_button:focus,.btn-group-vertical>a.DTTT_button:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>button.DTTT_button:active,.btn-group-vertical>div.DTTT_button:active,.btn-group-vertical>a.DTTT_button:active,.btn-group-vertical>.btn.active,.btn-group-vertical>button.active.DTTT_button,.btn-group-vertical>div.active.DTTT_button,.btn-group-vertical>a.active.DTTT_button{z-index:2}.btn-group>.btn:focus,.btn-group>button.DTTT_button:focus,.btn-group>div.DTTT_button:focus,.btn-group>a.DTTT_button:focus,.btn-group-vertical>.btn:focus,.btn-group-vertical>button.DTTT_button:focus,.btn-group-vertical>div.DTTT_button:focus,.btn-group-vertical>a.DTTT_button:focus{outline:none}.btn-group .btn+.btn,.btn-group button.DTTT_button+.btn,.btn-group div.DTTT_button+.btn,.btn-group a.DTTT_button+.btn,.btn-group .btn+button.DTTT_button,.btn-group button.DTTT_button+button.DTTT_button,.btn-group div.DTTT_button+button.DTTT_button,.btn-group a.DTTT_button+button.DTTT_button,.btn-group .btn+div.DTTT_button,.btn-group button.DTTT_button+div.DTTT_button,.btn-group div.DTTT_button+div.DTTT_button,.btn-group a.DTTT_button+div.DTTT_button,.btn-group .btn+a.DTTT_button,.btn-group button.DTTT_button+a.DTTT_button,.btn-group div.DTTT_button+a.DTTT_button,.btn-group a.DTTT_button+a.DTTT_button,.btn-group .btn+.btn-group,.btn-group button.DTTT_button+.btn-group,.btn-group div.DTTT_button+.btn-group,.btn-group a.DTTT_button+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+button.DTTT_button,.btn-group .btn-group+div.DTTT_button,.btn-group .btn-group+a.DTTT_button,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:before,.btn-toolbar:after{content:" ";display:table}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>button.DTTT_button,.btn-toolbar>div.DTTT_button,.btn-toolbar>a.DTTT_button,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle),.btn-group>button.DTTT_button:not(:first-child):not(:last-child):not(.dropdown-toggle),.btn-group>div.DTTT_button:not(:first-child):not(:last-child):not(.dropdown-toggle),.btn-group>a.DTTT_button:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child,.btn-group>button.DTTT_button:first-child,.btn-group>div.DTTT_button:first-child,.btn-group>a.DTTT_button:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle),.btn-group>button.DTTT_button:first-child:not(:last-child):not(.dropdown-toggle),.btn-group>div.DTTT_button:first-child:not(:last-child):not(.dropdown-toggle),.btn-group>a.DTTT_button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>button.DTTT_button:last-child:not(:first-child),.btn-group>div.DTTT_button:last-child:not(:first-child),.btn-group>a.DTTT_button:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn-group:not(:first-child):not(:last-child)>button.DTTT_button,.btn-group>.btn-group:not(:first-child):not(:last-child)>div.DTTT_button,.btn-group>.btn-group:not(:first-child):not(:last-child)>a.DTTT_button{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>button.DTTT_button:last-child,.btn-group>.btn-group:first-child>div.DTTT_button:last-child,.btn-group>.btn-group:first-child>a.DTTT_button:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child,.btn-group>.btn-group:last-child>button.DTTT_button:first-child,.btn-group>.btn-group:last-child>div.DTTT_button:first-child,.btn-group>.btn-group:last-child>a.DTTT_button:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle,.btn-group>button.DTTT_button+.dropdown-toggle,.btn-group>div.DTTT_button+.dropdown-toggle,.btn-group>a.DTTT_button+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group-lg.btn-group>button.DTTT_button+.dropdown-toggle,.btn-group-lg.btn-group>div.DTTT_button+.dropdown-toggle,.btn-group-lg.btn-group>a.DTTT_button+.dropdown-toggle{padding-left:12px;padding-right: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,button.DTTT_button .caret,div.DTTT_button .caret,a.DTTT_button .caret{margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret,.btn-group-lg>button.DTTT_button .caret,.btn-group-lg>div.DTTT_button .caret,.btn-group-lg>a.DTTT_button .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .caret,.dropup .btn-group-lg>button.DTTT_button .caret,.dropup .btn-group-lg>div.DTTT_button .caret,.dropup .btn-group-lg>a.DTTT_button .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>button.DTTT_button,.btn-group-vertical>div.DTTT_button,.btn-group-vertical>a.DTTT_button,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn,.btn-group-vertical>.btn-group>button.DTTT_button,.btn-group-vertical>.btn-group>div.DTTT_button,.btn-group-vertical>.btn-group>a.DTTT_button{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{content:" ";display:table}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn,.btn-group-vertical>.btn-group>button.DTTT_button,.btn-group-vertical>.btn-group>div.DTTT_button,.btn-group-vertical>.btn-group>a.DTTT_button{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>button.DTTT_button+.btn,.btn-group-vertical>div.DTTT_button+.btn,.btn-group-vertical>a.DTTT_button+.btn,.btn-group-vertical>.btn+button.DTTT_button,.btn-group-vertical>button.DTTT_button+button.DTTT_button,.btn-group-vertical>div.DTTT_button+button.DTTT_button,.btn-group-vertical>a.DTTT_button+button.DTTT_button,.btn-group-vertical>.btn+div.DTTT_button,.btn-group-vertical>button.DTTT_button+div.DTTT_button,.btn-group-vertical>div.DTTT_button+div.DTTT_button,.btn-group-vertical>a.DTTT_button+div.DTTT_button,.btn-group-vertical>.btn+a.DTTT_button,.btn-group-vertical>button.DTTT_button+a.DTTT_button,.btn-group-vertical>div.DTTT_button+a.DTTT_button,.btn-group-vertical>a.DTTT_button+a.DTTT_button,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>button.DTTT_button+.btn-group,.btn-group-vertical>div.DTTT_button+.btn-group,.btn-group-vertical>a.DTTT_button+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+button.DTTT_button,.btn-group-vertical>.btn-group+div.DTTT_button,.btn-group-vertical>.btn-group+a.DTTT_button,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group-vertical>button.DTTT_button:not(:first-child):not(:last-child),.btn-group-vertical>div.DTTT_button:not(:first-child):not(:last-child),.btn-group-vertical>a.DTTT_button:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child),.btn-group-vertical>button.DTTT_button:first-child:not(:last-child),.btn-group-vertical>div.DTTT_button:first-child:not(:last-child),.btn-group-vertical>a.DTTT_button:first-child:not(:last-child){border-top-right-radius:0px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child),.btn-group-vertical>button.DTTT_button:last-child:not(:first-child),.btn-group-vertical>div.DTTT_button:last-child:not(:first-child),.btn-group-vertical>a.DTTT_button:last-child:not(:first-child){border-bottom-left-radius:0px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>button.DTTT_button,.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>div.DTTT_button,.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>a.DTTT_button{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)>button.DTTT_button:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>div.DTTT_button:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>a.DTTT_button: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,.btn-group-vertical>.btn-group:last-child:not(:first-child)>button.DTTT_button:first-child,.btn-group-vertical>.btn-group:last-child:not(:first-child)>div.DTTT_button:first-child,.btn-group-vertical>.btn-group:last-child:not(:first-child)>a.DTTT_button:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>button.DTTT_button,.btn-group-justified>div.DTTT_button,.btn-group-justified>a.DTTT_button,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn,.btn-group-justified>.btn-group button.DTTT_button,.btn-group-justified>.btn-group div.DTTT_button,.btn-group-justified>.btn-group a.DTTT_button{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>button.DTTT_button>input[type="radio"],[data-toggle="buttons"]>div.DTTT_button>input[type="radio"],[data-toggle="buttons"]>a.DTTT_button>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"],[data-toggle="buttons"]>button.DTTT_button>input[type="checkbox"],[data-toggle="buttons"]>div.DTTT_button>input[type="checkbox"],[data-toggle="buttons"]>a.DTTT_button>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-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:12px;font-weight:normal;line-height:1;color:#63676a;text-align:center;background-color:#2b2b2b;border:1px solid #63676a;border-radius:0px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn,.input-group-sm>.input-group-btn>button.input-group-addon.DTTT_button,.input-group-sm>.input-group-btn>div.input-group-addon.DTTT_button,.input-group-sm>.input-group-btn>a.input-group-addon.DTTT_button{padding:5px 10px;font-size:11px;border-radius:3px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn,.input-group-lg>.input-group-btn>button.input-group-addon.DTTT_button,.input-group-lg>.input-group-btn>div.input-group-addon.DTTT_button,.input-group-lg>.input-group-btn>a.input-group-addon.DTTT_button{padding:10px 16px;font-size:15px;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>button.DTTT_button,.input-group-btn:first-child>div.DTTT_button,.input-group-btn:first-child>a.DTTT_button,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.btn-group>button.DTTT_button,.input-group-btn:first-child>.btn-group>div.DTTT_button,.input-group-btn:first-child>.btn-group>a.DTTT_button,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>button.DTTT_button:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>div.DTTT_button:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>a.DTTT_button:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn-group:not(:last-child)>button.DTTT_button,.input-group-btn:last-child>.btn-group:not(:last-child)>div.DTTT_button,.input-group-btn:last-child>.btn-group:not(:last-child)>a.DTTT_button{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>button.DTTT_button,.input-group-btn:last-child>div.DTTT_button,.input-group-btn:last-child>a.DTTT_button,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.btn-group>button.DTTT_button,.input-group-btn:last-child>.btn-group>div.DTTT_button,.input-group-btn:last-child>.btn-group>a.DTTT_button,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>button.DTTT_button:not(:first-child),.input-group-btn:first-child>div.DTTT_button:not(:first-child),.input-group-btn:first-child>a.DTTT_button:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn-group:not(:first-child)>button.DTTT_button,.input-group-btn:first-child>.btn-group:not(:first-child)>div.DTTT_button,.input-group-btn:first-child>.btn-group:not(:first-child)>a.DTTT_button{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn,.input-group-btn>button.DTTT_button,.input-group-btn>div.DTTT_button,.input-group-btn>a.DTTT_button{position:relative}.input-group-btn>.btn+.btn,.input-group-btn>button.DTTT_button+.btn,.input-group-btn>div.DTTT_button+.btn,.input-group-btn>a.DTTT_button+.btn,.input-group-btn>.btn+button.DTTT_button,.input-group-btn>button.DTTT_button+button.DTTT_button,.input-group-btn>div.DTTT_button+button.DTTT_button,.input-group-btn>a.DTTT_button+button.DTTT_button,.input-group-btn>.btn+div.DTTT_button,.input-group-btn>button.DTTT_button+div.DTTT_button,.input-group-btn>div.DTTT_button+div.DTTT_button,.input-group-btn>a.DTTT_button+div.DTTT_button,.input-group-btn>.btn+a.DTTT_button,.input-group-btn>button.DTTT_button+a.DTTT_button,.input-group-btn>div.DTTT_button+a.DTTT_button,.input-group-btn>a.DTTT_button+a.DTTT_button{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>button.DTTT_button:hover,.input-group-btn>div.DTTT_button:hover,.input-group-btn>a.DTTT_button:hover,.input-group-btn>.btn:focus,.input-group-btn>button.DTTT_button:focus,.input-group-btn>div.DTTT_button:focus,.input-group-btn>a.DTTT_button:focus,.input-group-btn>.btn:active,.input-group-btn>button.DTTT_button:active,.input-group-btn>div.DTTT_button:active,.input-group-btn>a.DTTT_button:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>button.DTTT_button,.input-group-btn:first-child>div.DTTT_button,.input-group-btn:first-child>a.DTTT_button,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>button.DTTT_button,.input-group-btn:last-child>div.DTTT_button,.input-group-btn:last-child>a.DTTT_button,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:before,.nav:after{content:" ";display:table}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:5px 6px 5px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#63676a}.nav>li.disabled>a{color:#63676a}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#63676a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#63676a;border-color:#375959}.nav .nav-divider{height:1px;margin:5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #adadad}.nav-tabs>li{float:left;margin-bottom:-1px;margin-right:2px}.nav-tabs>li>a{line-height:1.5;border:1px solid transparent}.nav-tabs>li>a:hover{border-color:#adadad #adadad #adadad}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#313335;border:1px solid #adadad;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0px}.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:#375959}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 780px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0px}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 780px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:0px 0px 0 0}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#313335}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:30px;margin-bottom:18px}.navbar:before,.navbar:after{content:" ";display:table}.navbar:after{clear:both}@media (min-width: 780px){.navbar{border-radius:0px}}.navbar-header:before,.navbar-header:after{content:" ";display:table}.navbar-header:after{clear:both}@media (min-width: 780px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:10px;padding-left:10px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media (min-width: 780px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:-10px;margin-left:-10px}@media (min-width: 780px){.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width: 780px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width: 780px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:6px 10px;font-size:15px;line-height:18px;height:30px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width: 780px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-10px}}.navbar-toggle{position:relative;float:right;margin-right:10px;margin-left:10px;padding:6px 12px;margin-top:-2px;margin-bottom:-2px;background-color:#adadad;background-image:none;border:1px solid #a0a0a0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}.navbar-toggle:focus{outline:none}.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: 780px){.navbar-toggle{display:none}}.navbar-nav{margin:3px -10px;float:left;margin:0}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width: 779px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:18px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}.navbar-nav>li{float:left;margin-right:2px}.navbar-nav>li>a{padding-top:6px;padding-bottom:6px}.navbar-nav.navbar-right:last-child{margin-right:-10px}@media (min-width: 780px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-10px;margin-right:-10px;padding:10px 10px;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:-1px;margin-bottom:-1px}@media (max-width: 779px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width: 780px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-10px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:-1px;margin-bottom:-1px}.navbar-btn.btn-sm,.btn-group-sm>.navbar-btn.btn,button.navbar-btn.DTTT_button,div.navbar-btn.DTTT_button,a.navbar-btn.DTTT_button{margin-top:1px;margin-bottom:1px}.navbar-btn.btn-xs,.btn-group-xs>.navbar-btn.btn,.btn-group-xs>button.navbar-btn.DTTT_button,.btn-group-xs>div.navbar-btn.DTTT_button,.btn-group-xs>a.navbar-btn.DTTT_button{margin-top:4px;margin-bottom:4px}.navbar-text{margin-top:6px;margin-bottom:6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;float:left;margin-left:10px;margin-right:10px}.navbar-text.navbar-right:last-child{margin-right:0}.navbar-default{background:rgba(43,43,43,0.9);border-color:none;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#568a89;background-color:transparent}.navbar-default .navbar-text{color:#63676a}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#1d1d1d;background-color:#63676a}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#2b2b2b;background-color:#adadad}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#a0a0a0;color:#2b2b2b}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#bababa}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:none}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#adadad;color:#2b2b2b}@media (max-width: 779px){.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:#1d1d1d;background-color:#63676a}.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:#2b2b2b;background-color:#adadad}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#1d1d1d}.navbar-inverse{background-color:#222;border-color:#090909}.navbar-inverse .navbar-brand{color:#63676a}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#63676a}.navbar-inverse .navbar-nav>li>a{color:#63676a}.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:#090909}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#090909;color:#fff}@media (max-width: 779px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#63676a}.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:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#63676a}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:0px 0px;margin-bottom:18px;list-style:none;background-color:none;border-radius:0px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/Ā ";padding:0 5px;color:#63676a}.breadcrumb>.active{color:#5cb85c}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:0px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.5;text-decoration:none;color:#375959;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0px;border-top-left-radius:0px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0px;border-top-right-radius:0px}.pagination>li>a:hover,.pagination>li>a:focus,.pagination>li>span:hover,.pagination>li>span:focus{color:#1a2a2a;background-color:#adadad;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:hover,.pagination>.active>a:focus,.pagination>.active>span,.pagination>.active>span:hover,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#375959;border-color:#375959;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#63676a;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:15px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:11px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:18px 0;list-style:none;text-align:center}.pager:before,.pager:after{content:" ";display:table}.pager:after{clear:both}.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:#adadad}.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:#63676a;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:2px 5px;font-size:75%;font-weight:bold;line-height:1;color:#1d1d1d;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:3px}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label,button.DTTT_button .label,div.DTTT_button .label,a.DTTT_button .label{position:relative;top:-1px}.label-default{background-color:#63676a}.label-default[href]:hover,.label-default[href]:focus{background-color:#4a4d50}.label-primary{background-color:#375959}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#243939}.label-success{background-color:#4f9e4f}.label-success[href]:hover,.label-success[href]:focus{background-color:#3e7c3e}.label-info{background-color:#316490}.label-info[href]:hover,.label-info[href]:focus{background-color:#244a6a}.label-warning{background-color:#e28a0d}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#b26d0a}.label-danger{background-color:#a52521}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#7b1b18}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:11px;font-weight:bold;color:#eaeaea;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#63676a;border-radius:10px}.badge:empty{display:none}.btn .badge,button.DTTT_button .badge,div.DTTT_button .badge,a.DTTT_button .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge,.btn-group-xs>button.DTTT_button .badge,.btn-group-xs>div.DTTT_button .badge,.btn-group-xs>a.DTTT_button .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#375959;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#adadad}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:18px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width: 780px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:54px}}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.5;background-color:#313335;border:1px solid #ddd;border-radius:0px;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#63676a}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#375959}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:0px}.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{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#d1e8d1;border-color:#4f9e4f;color:#2b2b2b}.alert-success hr{border-top-color:#478d47}.alert-success .alert-link{color:#121212}.alert-info{background-color:#abc9e2;border-color:#316490;color:#2b2b2b}.alert-info hr{border-top-color:#2b577d}.alert-info .alert-link{color:#121212}.alert-warning{background-color:#fef8f0;border-color:#e28a0d;color:#2b2b2b}.alert-warning hr{border-top-color:#ca7b0c}.alert-warning .alert-link{color:#121212}.alert-danger{background-color:#f6d1d0;border-color:#a52521;color:#2b2b2b}.alert-danger hr{border-top-color:#90201d}.alert-danger .alert-link{color:#121212}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f5f5f5;border-radius:0px;-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:11px;line-height:18px;color:#fff;text-align:center;background-color:#375959;-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;transition:width 0.6s ease}.progress-striped .progress-bar{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:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#4f9e4f}.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:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-info{background-color:#316490}.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:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-warning{background-color:#e28a0d}.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:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-danger{background-color:#a52521}.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:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:6px 8px;background-color:#adadad;border-bottom:1px solid #63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.list-group-item:first-child{border-top-right-radius:0px;border-top-left-radius:0px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0px;border-bottom-left-radius:0px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#63676a;color:#1d1d1d}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#eaeaea;background-color:#375959;border-color:#375959}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#9bc1c1}.list-group-item-success{color:#2b2b2b;background-color:#d1e8d1}a.list-group-item-success{color:#2b2b2b}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#2b2b2b;background-color:#c0e0c0}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-info{color:#2b2b2b;background-color:#abc9e2}a.list-group-item-info{color:#2b2b2b}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#2b2b2b;background-color:#98bcdc}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-warning{color:#2b2b2b;background-color:#fef8f0}a.list-group-item-warning{color:#2b2b2b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#2b2b2b;background-color:#fdedd8}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-danger{color:#2b2b2b;background-color:#f6d1d0}a.list-group-item-danger{color:#2b2b2b}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#2b2b2b;background-color:#f1bcba}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:0px;-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-body:before,.panel-body:after{content:" ";display:table}.panel-body:after{clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1px;border-top-left-radius:-1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:14px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1px;border-top-left-radius:-1px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1px;border-top-left-radius:-1px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:-1px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:-1px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1px;border-bottom-left-radius:-1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:-1px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:-1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #313335}.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-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th: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-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th: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-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:0px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#313335;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#375959}.panel-primary>.panel-heading{color:#fff;background-color:#375959;border-color:#375959}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#375959}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#375959}.panel-success{border-color:#4f9e4f}.panel-success>.panel-heading{color:#2b2b2b;background-color:#d1e8d1;border-color:#4f9e4f}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#4f9e4f}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#4f9e4f}.panel-info{border-color:#316490}.panel-info>.panel-heading{color:#2b2b2b;background-color:#abc9e2;border-color:#316490}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#316490}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#316490}.panel-warning{border-color:#e28a0d}.panel-warning>.panel-heading{color:#2b2b2b;background-color:#fef8f0;border-color:#e28a0d}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#e28a0d}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#e28a0d}.panel-danger{border-color:#a52521}.panel-danger>.panel-heading{color:#2b2b2b;background-color:#f6d1d0;border-color:#a52521}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#a52521}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#a52521}.well{min-height:20px;padding:10px;margin-bottom:20px;background-color:#63676a;border:1px solid #313335;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;color:#2b2b2b;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well a{color:#6caead}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:18px;font-weight:bold;line-height:1;color:#a52521}.close:hover,.close:focus{color:#a52521;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}.modal-dialog{position:relative;width:auto;margin:10px;z-index:1050}.modal-content{position:relative;background-color:#3c3f41;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);background-clip:padding-box;outline:none}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:14px;border-bottom:1px solid #303234;min-height:15.5px;background-color:#353739}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:14px;color:#adadad}.modal-footer{padding:13px 14px 14px;text-align:right;border-top:1px solid #303234;background-color:#353739}.modal-footer:before,.modal-footer:after{content:" ";display:table}.modal-footer:after{clear:both}.modal-footer .btn+.btn,.modal-footer button.DTTT_button+.btn,.modal-footer div.DTTT_button+.btn,.modal-footer a.DTTT_button+.btn,.modal-footer .btn+button.DTTT_button,.modal-footer button.DTTT_button+button.DTTT_button,.modal-footer div.DTTT_button+button.DTTT_button,.modal-footer a.DTTT_button+button.DTTT_button,.modal-footer .btn+div.DTTT_button,.modal-footer button.DTTT_button+div.DTTT_button,.modal-footer div.DTTT_button+div.DTTT_button,.modal-footer a.DTTT_button+div.DTTT_button,.modal-footer .btn+a.DTTT_button,.modal-footer button.DTTT_button+a.DTTT_button,.modal-footer div.DTTT_button+a.DTTT_button,.modal-footer a.DTTT_button+a.DTTT_button{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn,.modal-footer .btn-group button.DTTT_button+.btn,.modal-footer .btn-group div.DTTT_button+.btn,.modal-footer .btn-group a.DTTT_button+.btn,.modal-footer .btn-group .btn+button.DTTT_button,.modal-footer .btn-group button.DTTT_button+button.DTTT_button,.modal-footer .btn-group div.DTTT_button+button.DTTT_button,.modal-footer .btn-group a.DTTT_button+button.DTTT_button,.modal-footer .btn-group .btn+div.DTTT_button,.modal-footer .btn-group button.DTTT_button+div.DTTT_button,.modal-footer .btn-group div.DTTT_button+div.DTTT_button,.modal-footer .btn-group a.DTTT_button+div.DTTT_button,.modal-footer .btn-group .btn+a.DTTT_button,.modal-footer .btn-group button.DTTT_button+a.DTTT_button,.modal-footer .btn-group div.DTTT_button+a.DTTT_button,.modal-footer .btn-group a.DTTT_button+a.DTTT_button{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width: 780px){.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: 1200px){.modal-lg>.modal-dialog{width:820px}}.tooltip{position:absolute;z-index:1010;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:0px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.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{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right: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;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1030;display:none;max-width:276px;padding:1px;text-align:left;background-color:#3c3f41;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:12px;font-weight:normal;line-height:18px;background-color:#353739;border-bottom:1px solid #282a2c;border-radius:5px 5px 0 0;color:#63676a}.popover-content{padding:7px 10px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#63676a}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#63676a}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#63676a}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#63676a;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.5) 0%), color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0%,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.0001) 0%), color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0%,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:none;color:#fff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.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}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn,.carousel-caption button.DTTT_button,.carousel-caption div.DTTT_button,.carousel-caption a.DTTT_button{text-shadow:none}@media screen and (min-width: 780px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}@media (max-width: 779px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (min-width: 780px) and (max-width: 1199px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width: 1200px) and (max-width: 1599px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width: 1600px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (max-width: 779px){.hidden-xs{display:none !important}}@media (min-width: 780px) and (max-width: 1199px){.hidden-sm{display:none !important}}@media (min-width: 1200px) and (max-width: 1599px){.hidden-md{display:none !important}}@media (min-width: 1600px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}@media print{.hidden-print{display:none !important}}/*! * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.3.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.3.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.3.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:0.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:"ļ€ƒ"}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:"ļ€ˆ"}.fa-th-large:before{content:""}.fa-th:before{content:"ļ€Š"}.fa-th-list:before{content:""}.fa-check:before{content:"ļ€Œ"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"ļ€"}.fa-search-plus:before{content:"ļ€Ž"}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:"ļ€˜"}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:"ļ€š"}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:"ļ€œ"}.fa-play-circle-o:before{content:"ļ€"}.fa-rotate-right:before,.fa-repeat:before{content:"ļ€ž"}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:"ļ"}.fa-forward:before{content:"ļŽ"}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:"ļ"}.fa-ban:before{content:"ļž"}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"ļ‚€"}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:"ļ‚‚"}.fa-camera-retro:before{content:"ļ‚ƒ"}.fa-key:before{content:"ļ‚„"}.fa-gears:before,.fa-cogs:before{content:"ļ‚…"}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:"ļ‚ˆ"}.fa-star-half:before{content:""}.fa-heart-o:before{content:"ļ‚Š"}.fa-sign-out:before{content:"ļ‚‹"}.fa-linkedin-square:before{content:"ļ‚Œ"}.fa-thumb-tack:before{content:"ļ‚"}.fa-external-link:before{content:"ļ‚Ž"}.fa-sign-in:before{content:""}.fa-trophy:before{content:"ļ‚‘"}.fa-github-square:before{content:"ļ‚’"}.fa-upload:before{content:"ļ‚“"}.fa-lemon-o:before{content:"ļ‚”"}.fa-phone:before{content:"ļ‚•"}.fa-square-o:before{content:"ļ‚–"}.fa-bookmark-o:before{content:"ļ‚—"}.fa-phone-square:before{content:"ļ‚˜"}.fa-twitter:before{content:"ļ‚™"}.fa-facebook-f:before,.fa-facebook:before{content:"ļ‚š"}.fa-github:before{content:"ļ‚›"}.fa-unlock:before{content:"ļ‚œ"}.fa-credit-card:before{content:"ļ‚"}.fa-rss:before{content:"ļ‚ž"}.fa-hdd-o:before{content:"ļ‚ "}.fa-bullhorn:before{content:"ļ‚”"}.fa-bell:before{content:""}.fa-certificate:before{content:"ļ‚£"}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:"ļ‚„"}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:"ļ‚§"}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:"ļ‚©"}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:"ļ‚«"}.fa-globe:before{content:""}.fa-wrench:before{content:"ļ‚­"}.fa-tasks:before{content:"ļ‚®"}.fa-filter:before{content:"ļ‚°"}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:"ļƒ€"}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:"ļƒ‚"}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:"ļƒ„"}.fa-copy:before,.fa-files-o:before{content:"ļƒ…"}.fa-paperclip:before{content:"ļƒ†"}.fa-save:before,.fa-floppy-o:before{content:"ļƒ‡"}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"ļƒ‰"}.fa-list-ul:before{content:""}.fa-list-ol:before{content:"ļƒ‹"}.fa-strikethrough:before{content:""}.fa-underline:before{content:"ļƒ"}.fa-table:before{content:"ļƒŽ"}.fa-magic:before{content:""}.fa-truck:before{content:"ļƒ‘"}.fa-pinterest:before{content:"ļƒ’"}.fa-pinterest-square:before{content:"ļƒ“"}.fa-google-plus-square:before{content:"ļƒ”"}.fa-google-plus:before{content:"ļƒ•"}.fa-money:before{content:"ļƒ–"}.fa-caret-down:before{content:"ļƒ—"}.fa-caret-up:before{content:""}.fa-caret-left:before{content:"ļƒ™"}.fa-caret-right:before{content:""}.fa-columns:before{content:"ļƒ›"}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:"ļƒ"}.fa-sort-up:before,.fa-sort-asc:before{content:"ļƒž"}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:"ļ‚¢"}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:"ļ„€"}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:"ļ„‚"}.fa-angle-double-down:before{content:"ļ„ƒ"}.fa-angle-left:before{content:"ļ„„"}.fa-angle-right:before{content:"ļ„…"}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:"ļ„ˆ"}.fa-laptop:before{content:""}.fa-tablet:before{content:"ļ„Š"}.fa-mobile-phone:before,.fa-mobile:before{content:"ļ„‹"}.fa-circle-o:before{content:"ļ„Œ"}.fa-quote-left:before{content:"ļ„"}.fa-quote-right:before{content:"ļ„Ž"}.fa-spinner:before{content:""}.fa-circle:before{content:"ļ„‘"}.fa-mail-reply:before,.fa-reply:before{content:"ļ„’"}.fa-github-alt:before{content:"ļ„“"}.fa-folder-o:before{content:"ļ„”"}.fa-folder-open-o:before{content:"ļ„•"}.fa-smile-o:before{content:"ļ„˜"}.fa-frown-o:before{content:"ļ„™"}.fa-meh-o:before{content:"ļ„š"}.fa-gamepad:before{content:"ļ„›"}.fa-keyboard-o:before{content:"ļ„œ"}.fa-flag-o:before{content:"ļ„"}.fa-flag-checkered:before{content:"ļ„ž"}.fa-terminal:before{content:"ļ„ "}.fa-code:before{content:"ļ„”"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"ļ„¢"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"ļ„£"}.fa-location-arrow:before{content:""}.fa-crop:before{content:"ļ„„"}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:"ļ„§"}.fa-question:before{content:""}.fa-info:before{content:"ļ„©"}.fa-exclamation:before{content:""}.fa-superscript:before{content:"ļ„«"}.fa-subscript:before{content:""}.fa-eraser:before{content:"ļ„­"}.fa-puzzle-piece:before{content:"ļ„®"}.fa-microphone:before{content:"ļ„°"}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:"ļ„“"}.fa-rocket:before{content:""}.fa-maxcdn:before{content:"ļ„¶"}.fa-chevron-circle-left:before{content:"ļ„·"}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:"ļ„»"}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:"ļ…€"}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:"ļ…‚"}.fa-rss-square:before{content:"ļ…ƒ"}.fa-play-circle:before{content:"ļ…„"}.fa-ticket:before{content:"ļ……"}.fa-minus-square:before{content:"ļ…†"}.fa-minus-square-o:before{content:"ļ…‡"}.fa-level-up:before{content:"ļ…ˆ"}.fa-level-down:before{content:"ļ…‰"}.fa-check-square:before{content:"ļ…Š"}.fa-pencil-square:before{content:"ļ…‹"}.fa-external-link-square:before{content:"ļ…Œ"}.fa-share-square:before{content:"ļ…"}.fa-compass:before{content:"ļ…Ž"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"ļ…‘"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"ļ…’"}.fa-euro:before,.fa-eur:before{content:"ļ…“"}.fa-gbp:before{content:"ļ…”"}.fa-dollar:before,.fa-usd:before{content:"ļ…•"}.fa-rupee:before,.fa-inr:before{content:"ļ…–"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"ļ…—"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"ļ…˜"}.fa-won:before,.fa-krw:before{content:"ļ…™"}.fa-bitcoin:before,.fa-btc:before{content:"ļ…š"}.fa-file:before{content:"ļ…›"}.fa-file-text:before{content:"ļ…œ"}.fa-sort-alpha-asc:before{content:"ļ…"}.fa-sort-alpha-desc:before{content:"ļ…ž"}.fa-sort-amount-asc:before{content:"ļ… "}.fa-sort-amount-desc:before{content:"ļ…”"}.fa-sort-numeric-asc:before{content:"ļ…¢"}.fa-sort-numeric-desc:before{content:"ļ…£"}.fa-thumbs-up:before{content:"ļ…¤"}.fa-thumbs-down:before{content:"ļ…„"}.fa-youtube-square:before{content:"ļ…¦"}.fa-youtube:before{content:"ļ…§"}.fa-xing:before{content:"ļ…Ø"}.fa-xing-square:before{content:"ļ…©"}.fa-youtube-play:before{content:"ļ…Ŗ"}.fa-dropbox:before{content:"ļ…«"}.fa-stack-overflow:before{content:"ļ…¬"}.fa-instagram:before{content:"ļ…­"}.fa-flickr:before{content:"ļ…®"}.fa-adn:before{content:"ļ…°"}.fa-bitbucket:before{content:"ļ…±"}.fa-bitbucket-square:before{content:"ļ…²"}.fa-tumblr:before{content:"ļ…³"}.fa-tumblr-square:before{content:"ļ…“"}.fa-long-arrow-down:before{content:"ļ…µ"}.fa-long-arrow-up:before{content:"ļ…¶"}.fa-long-arrow-left:before{content:"ļ…·"}.fa-long-arrow-right:before{content:"ļ…ø"}.fa-apple:before{content:"ļ…¹"}.fa-windows:before{content:"ļ…ŗ"}.fa-android:before{content:"ļ…»"}.fa-linux:before{content:"ļ…¼"}.fa-dribbble:before{content:"ļ…½"}.fa-skype:before{content:"ļ…¾"}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:"ļ†ƒ"}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:"ļ†ˆ"}.fa-vk:before{content:""}.fa-weibo:before{content:"ļ†Š"}.fa-renren:before{content:""}.fa-pagelines:before{content:"ļ†Œ"}.fa-stack-exchange:before{content:"ļ†"}.fa-arrow-circle-o-right:before{content:"ļ†Ž"}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:"ļ†˜"}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:"ļ†š"}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"ļ†œ"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"ļ†"}.fa-yahoo:before{content:"ļ†ž"}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:"ļ‡ƒ"}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:"ļ‡ˆ"}.fa-file-code-o:before{content:""}.fa-vine:before{content:"ļ‡Š"}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:"ļ‡Œ"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"ļ‡"}.fa-circle-o-notch:before{content:"ļ‡Ž"}.fa-ra:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:"ļ‡˜"}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:"ļ‡š"}.fa-genderless:before,.fa-circle-thin:before{content:""}.fa-header:before{content:"ļ‡œ"}.fa-paragraph:before{content:"ļ‡"}.fa-sliders:before{content:"ļ‡ž"}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:"ļˆ€"}.fa-line-chart:before{content:""}.fa-lastfm:before{content:"ļˆ‚"}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:"ļˆ„"}.fa-toggle-on:before{content:"ļˆ…"}.fa-bicycle:before{content:"ļˆ†"}.fa-bus:before{content:"ļˆ‡"}.fa-ioxhost:before{content:""}.fa-angellist:before{content:"ļˆ‰"}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"ļˆ‹"}.fa-meanpath:before{content:""}.fa-buysellads:before{content:"ļˆ"}.fa-connectdevelop:before{content:"ļˆŽ"}.fa-dashcube:before{content:""}.fa-forumbee:before{content:"ļˆ‘"}.fa-leanpub:before{content:"ļˆ’"}.fa-sellsy:before{content:"ļˆ“"}.fa-shirtsinbulk:before{content:"ļˆ”"}.fa-simplybuilt:before{content:"ļˆ•"}.fa-skyatlas:before{content:"ļˆ–"}.fa-cart-plus:before{content:"ļˆ—"}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:"ļˆ™"}.fa-ship:before{content:""}.fa-user-secret:before{content:"ļˆ›"}.fa-motorcycle:before{content:""}.fa-street-view:before{content:"ļˆ"}.fa-heartbeat:before{content:"ļˆž"}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.mCustomScrollbar{touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:none;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:0.75;filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;border-radius:16px;background-color:#000;background-color:rgba(0,0,0,0.4);filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;border-radius:16px;text-align:center;background-color:#fff;background-color:rgba(255,255,255,0.75);filter:"alpha(opacity=75)"}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_buttonDown{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0;background-position:0 -20px}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight{transition:opacity .2s ease-in-out, background-color .2s ease-in-out}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail{transition:width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox ~ .mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)"}.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox ~ .mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover ~ .mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox ~ .mCSB_scrollTools{opacity:1;filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,0.85);filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,0.9);filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACQCAYAAACPtWCAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxMURDMzE5NzIzQkNFMTExOTY0QkYwNzFDNzkwNTlDNCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDOTMwRUZENEMxMUUxMUUzOUYxQkJGN0E1MDMzNTg1MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDOTMwRUZEM0MxMUUxMUUzOUYxQkJGN0E1MDMzNTg1MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MGJlMjMyZC1hNzgzLTI1NGQtOTI4Yy02NDI0YmQxNTg0YWEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTFEQzMxOTcyM0JDRTExMTk2NEJGMDcxQzc5MDU5QzQiLz4gPC9yZGY6RGVzY3Jp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');background-repeat:no-repeat;opacity:0.4;filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonUp:hover,.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover{opacity:0.75;filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonUp:active,.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active{opacity:0.9;filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,0.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,0.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:rgba(0,0,0,0.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,0.1);border-radius:1px}.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,0.75);border-radius:1px}.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,0.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,0.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,0.1);border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.75);border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,0.1);border-radius:2px}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,0.75);border-radius:2px}.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,0.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,0.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,0.1);border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.75);border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,0.1)}.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,0.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,0.15)}.mCS-rounded.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,0.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==");background-repeat:repeat-y;opacity:0.3;filter:"alpha(opacity=30)"}.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=")}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:linear-gradient(to right, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%)}.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:linear-gradient(to bottom, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%)}.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d.mCSB_scrollTools,.mCS-3d-dark.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)"}.mCS-3d.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{border-radius:16px}.mCS-3d.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,0.2);box-shadow:inset 1px 0 1px rgba(0,0,0,0.5),inset -1px 0 1px rgba(255,255,255,0.2)}.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#555}.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,0.5),inset 0 -1px 1px rgba(255,255,255,0.2)}.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,0.1);box-shadow:inset 1px 0 1px rgba(0,0,0,0.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,0.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)"}.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{border-radius:7px}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,0.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick.mCSB_scrollTools_vertical,.mCS-3d-thick-dark.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,0.1),inset 0 0 14px rgba(0,0,0,0.5)}.mCS-3d-thick.mCSB_scrollTools_horizontal,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,0.1),inset 0 0 14px rgba(0,0,0,0.5)}.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,0.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,0.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,0.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,0.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,0.1),inset 0 0 14px rgba(0,0,0,0.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,0.4),inset -1px 0 0 rgba(0,0,0,0.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,0.4),inset 0 -1px 0 rgba(0,0,0,0.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,0.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,0.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,0.2);filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,0.5);filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.2);filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.5);filter:"alpha(opacity=50)"}.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,0.2)}.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,0.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,0.2)}.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.75)}.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.85)}.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.9)}.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,0.1)}.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,0.2);box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,0.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,0.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,0.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,0.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,0.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,0.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,0.9)}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #3c3f41}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #3c3f41}table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting{cursor:pointer;*cursor:hand}table.dataTable thead .sorting{background:url("../img/data-tables/sort_both.png") no-repeat center right}table.dataTable thead .sorting_asc{background:url("../img/data-tables/sort_asc.png") no-repeat center right}table.dataTable thead .sorting_desc{background:url("../img/data-tables/sort_desc.png") no-repeat center right}table.dataTable thead .sorting_asc_disabled{background:url("../img/data-tables/sort_asc_disabled.png") no-repeat center right}table.dataTable thead .sorting_desc_disabled{background:url("../img/data-tables/sort_desc_disabled.png") no-repeat center right}table.dataTable tbody tr{background-color:#212121}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #3c3f41}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #dddddd;border-right:1px solid #dddddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #dddddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#2b2b2b}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.hover tbody tr.odd:hover,table.dataTable.hover tbody tr.even:hover,table.dataTable.display tbody tr:hover,table.dataTable.display tbody tr.odd:hover,table.dataTable.display tbody tr.even:hover{background-color:#e28a0d;color:#2b2b2b}table.dataTable.hover tbody tr:hover a,table.dataTable.hover tbody tr.odd:hover a,table.dataTable.hover tbody tr.even:hover a,table.dataTable.display tbody tr:hover a,table.dataTable.display tbody tr.odd:hover a,table.dataTable.display tbody tr.even:hover a{color:#2b2b2b !important}table.dataTable.hover tbody tr:hover td>.btn,table.dataTable.hover tbody tr:hover td>button.DTTT_button,table.dataTable.hover tbody tr:hover td>div.DTTT_button,table.dataTable.hover tbody tr:hover td>a.DTTT_button,table.dataTable.hover tbody tr.odd:hover td>.btn,table.dataTable.hover tbody tr.odd:hover td>button.DTTT_button,table.dataTable.hover tbody tr.odd:hover td>div.DTTT_button,table.dataTable.hover tbody tr.odd:hover td>a.DTTT_button,table.dataTable.hover tbody tr.even:hover td>.btn,table.dataTable.hover tbody tr.even:hover td>button.DTTT_button,table.dataTable.hover tbody tr.even:hover td>div.DTTT_button,table.dataTable.hover tbody tr.even:hover td>a.DTTT_button,table.dataTable.display tbody tr:hover td>.btn,table.dataTable.display tbody tr:hover td>button.DTTT_button,table.dataTable.display tbody tr:hover td>div.DTTT_button,table.dataTable.display tbody tr:hover td>a.DTTT_button,table.dataTable.display tbody tr.odd:hover td>.btn,table.dataTable.display tbody tr.odd:hover td>button.DTTT_button,table.dataTable.display tbody tr.odd:hover td>div.DTTT_button,table.dataTable.display tbody tr.odd:hover td>a.DTTT_button,table.dataTable.display tbody tr.even:hover td>.btn,table.dataTable.display tbody tr.even:hover td>button.DTTT_button,table.dataTable.display tbody tr.even:hover td>div.DTTT_button,table.dataTable.display tbody tr.even:hover td>a.DTTT_button{color:#eaeaea !important}table.dataTable.hover tbody tr:hover.selected,table.dataTable.hover tbody tr.odd:hover.selected,table.dataTable.hover tbody tr.even:hover.selected,table.dataTable.display tbody tr:hover.selected,table.dataTable.display tbody tr.odd:hover.selected,table.dataTable.display tbody tr.even:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#212C30}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#212C30}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.display tbody tr.odd:hover>.sorting_1,table.dataTable.display tbody tr.even:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_1{background-color:#c2760c}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.display tbody tr.odd:hover>.sorting_2,table.dataTable.display tbody tr.even:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.display tbody tr.odd:hover>.sorting_3,table.dataTable.display tbody tr.even:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_3{background-color:#eeeeee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.display tbody tr.odd:hover.selected>.sorting_1,table.dataTable.display tbody tr.even:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.display tbody tr.odd:hover.selected>.sorting_2,table.dataTable.display tbody tr.even:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.display tbody tr.odd:hover.selected>.sorting_3,table.dataTable.display tbody tr.even:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #3c3f41}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:5px 9px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:5px 9px 3px 9px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px 5px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.3em 0.7em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333333 !important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#adadad !important;border:none;background-color:#313335;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #313335), color-stop(100%, #2b2b2b));background:-webkit-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:-moz-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:-ms-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:-o-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:linear-gradient(to bottom, #313335 0%,#2b2b2b 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:#313335 !important;border:1px solid transparent;background-color:#c2760c;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #c2760c), color-stop(100%, #c2760c));background:-webkit-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-moz-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-ms-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-o-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:linear-gradient(to bottom, #c2760c 0%,#c2760c 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%,#0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#63676a}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}div.DTTT_container{position:relative;float:right;margin-bottom:1em}@media screen and (max-width: 640px){div.DTTT_container{float:none !important;text-align:center}div.DTTT_container:after{visibility:hidden;display:block;content:"";clear:both;height:0}}button.DTTT_button,div.DTTT_button,a.DTTT_button{margin-left:10px;position:relative;display:inline-block}.DTTT_button embed{outline:none}button.DTTT_button_collection span{padding-right:17px;background:url(../images/collection.png) no-repeat center right}button.DTTT_button_collection:hover span{padding-right:17px;background:#f0f0f0 url(../images/collection_hover.png) no-repeat center right}table.DTTT_selectable tbody tr{cursor:pointer;*cursor:hand}table.dataTable tr.DTTT_selected.odd{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_1{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_2{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_3{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.even{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_1{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_2{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_3{background-color:#B0BED9}div.DTTT_collection{width:150px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:#f3f3f3;background-color:rgba(255,255,255,0.3);overflow:hidden;z-index:2002;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;-webkit-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-moz-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-ms-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-o-box-shadow:3px 3px 5px rgba(0,0,0,0.3);box-shadow:3px 3px 5px rgba(0,0,0,0.3)}div.DTTT_collection_background{background:transparent url(../images/background.png) repeat top left;z-index:2001}div.DTTT_collection button.DTTT_button,div.DTTT_collection div.DTTT_button,div.DTTT_collection a.DTTT_button{position:relative;left:0;right:0;display:block;float:none;margin-bottom:4px;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999}.DTTT_print_info{position:fixed;top:50%;left:50%;width:400px;height:150px;margin-left:-200px;margin-top:-75px;text-align:center;color:#333;padding:10px 30px;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-moz-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-ms-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-o-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:linear-gradient(to bottom, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 );opacity:0.95;border:1px solid black;border:1px solid rgba(0,0,0,0.5);-webkit-border-radius:6px;-moz-border-radius:6px;-ms-border-radius:6px;-o-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.5);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.5);-ms-box-shadow:0 3px 7px rgba(0,0,0,0.5);-o-box-shadow:0 3px 7px rgba(0,0,0,0.5);box-shadow:0 3px 7px rgba(0,0,0,0.5)}.DTTT_print_info h6{font-weight:normal;font-size:28px;line-height:28px;margin:1em}.DTTT_print_info p{font-size:14px;line-height:20px}/*! @@ -24,7 +24,7 @@ */table.dataTable thead th{position:relative;background-image:none !important}table.dataTable thead th.sorting:after,table.dataTable thead th.sorting_asc:after,table.dataTable thead th.sorting_desc:after{position:absolute;top:12px;right:8px;display:block;font-family:FontAwesome;margin-top:-5px}table.dataTable thead th:after{color:#568a89}table.dataTable thead th.sorting:after{content:"\f0dc";color:#5cb85c;font-size:0.8em;margin-top:-5px}table.dataTable thead th.sorting_asc:after{content:"\f0de"}table.dataTable thead th.sorting_desc:after{content:"\f0dd"}div.dataTables_scrollBody table.dataTable thead th.sorting:after,div.dataTables_scrollBody table.dataTable thead th.sorting_asc:after,div.dataTables_scrollBody table.dataTable thead th.sorting_desc:after{content:""}table.table thead th.sorting:after,table.table thead th.sorting_asc:after,table.table thead th.sorting_desc:after{top:8px}div.dataTables_paginate a.paginate_button.first,div.dataTables_paginate a.paginate_button.previous{position:relative;padding-left:24px}div.dataTables_paginate a.paginate_button.next,div.dataTables_paginate a.paginate_button.last{position:relative;padding-right:24px}div.dataTables_paginate a.first:before,div.dataTables_paginate a.previous:before{position:absolute;top:4px;left:10px;display:block;font-family:FontAwesome}div.dataTables_paginate a.next:after,div.dataTables_paginate a.last:after{position:absolute;top:4px;right:10px;display:block;font-family:FontAwesome}div.dataTables_paginate a.first:before{content:"\f100"}div.dataTables_paginate a.previous:before{content:"\f104"}div.dataTables_paginate a.next:after{content:"\f105"}div.dataTables_paginate a.last:after{content:"\f101"}div.dataTables_paginate li.first>a,div.dataTables_paginate li.previous>a{position:relative;padding-left:24px}div.dataTables_paginate li.next>a,div.dataTables_paginate li.last>a{position:relative;padding-right:24px}div.dataTables_paginate li.first a:before,div.dataTables_paginate li.previous a:before{position:absolute;top:6px;left:10px;display:block;font-family:FontAwesome}div.dataTables_paginate li.next a:after,div.dataTables_paginate li.last a:after{position:absolute;top:6px;right:10px;display:block;font-family:FontAwesome}div.dataTables_paginate li.first a:before{content:"\f100"}div.dataTables_paginate li.previous a:before{content:"\f104"}div.dataTables_paginate li.next a:after{content:"\f105"}div.dataTables_paginate li.last a:after{content:"\f101"}div.columns div.dataTables_paginate li.first a:before,div.columns div.dataTables_paginate li.previous a:before,div.columns div.dataTables_paginate li.next a:after,div.columns div.dataTables_paginate li.last a:after{top:0}/*! X-editable - v1.5.0 * In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery * http://github.com/vitalets/x-editable -* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */.editableform{margin-bottom:0}.editableform .control-group{margin-bottom:0;white-space:nowrap;line-height:20px}.editable-buttons{display:inline-block;vertical-align:top;margin-left:7px;zoom:1;*display:inline}.editable-buttons.editable-buttons-bottom{display:block;margin-top:7px;margin-left:0}.editable-input{vertical-align:top;display:inline-block;width:auto;white-space:normal;zoom:1;*display:inline}.editable-buttons .editable-cancel{margin-left:7px}.editable-buttons button.ui-button-icon-only{height:24px;width:30px}.editableform-loading{height:25px;width:auto;min-width:25px}.editable-inline .editableform-loading{background-position:left 5px}.editable-error-block{max-width:300px;margin:5px 0 0 0;width:auto;white-space:normal}.editable-error-block.ui-state-error{padding:3px}.editable-error{color:red}.editableform .editable-date{padding:0;margin:0;float:left}.editable-inline .add-on .icon-th{margin-top:3px;margin-left:1px}.editable-checklist label input[type="checkbox"],.editable-checklist label span{vertical-align:middle;margin:0}.editable-checklist label{white-space:nowrap}.editable-wysihtml5{width:566px;height:250px}.editable-clear{clear:both;font-size:0.9em;text-decoration:none;text-align:right}.editable-clear-x{display:block;width:13px;height:13px;position:absolute;opacity:0.6;z-index:100;top:50%;right:6px;margin-top:-6px}.editable-clear-x:hover{opacity:1}.editable-pre-wrapped{white-space:pre-wrap}.editable-container.editable-popup{max-width:none !important}.editable-container.popover{width:auto}.editable-container.editable-inline{display:inline-block;vertical-align:middle;width:auto;zoom:1;*display:inline}.editable-container.ui-widget{font-size:inherit;z-index:9990}.editable-click,a.editable-click,a.editable-click:hover{text-decoration:none;border-bottom:dashed 1px #568a89}.editable-click.editable-disabled,a.editable-click.editable-disabled,a.editable-click.editable-disabled:hover{color:#585858;cursor:default;border-bottom:none}.editable-empty,.editable-empty:hover,.editable-empty:focus{font-style:italic;color:#d9534f;text-decoration:none}.editable-unsaved{font-weight:bold}.editable-bg-transition{-webkit-transition:background-color 1400ms ease-out;-moz-transition:background-color 1400ms ease-out;-o-transition:background-color 1400ms ease-out;-ms-transition:background-color 1400ms ease-out;transition:background-color 1400ms ease-out}.form-horizontal .editable{padding-top:5px;display:inline-block}/*! +* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */.editableform{margin-bottom:0}.editableform .form-group{margin-left:0 !important}.editableform .control-group{margin-bottom:0;white-space:nowrap;line-height:20px}.editable-buttons{display:inline-block;vertical-align:top;margin-left:7px;zoom:1;*display:inline}.editable-buttons.editable-buttons-bottom{display:block;margin-top:7px;margin-left:0}.editable-input{vertical-align:top;display:inline-block;width:auto;white-space:normal;zoom:1;*display:inline}.editable-buttons .editable-cancel{margin-left:7px}.editable-buttons button.ui-button-icon-only{height:24px;width:30px}.editableform-loading{height:25px;width:auto;min-width:25px}.editable-inline .editableform-loading{background-position:left 5px}.editable-error-block{max-width:300px;margin:5px 0 0 0;width:auto;white-space:normal}.editable-error-block.ui-state-error{padding:3px}.editable-error{color:red}.editableform .editable-date{padding:0;margin:0;float:left}.editable-inline .add-on .icon-th{margin-top:3px;margin-left:1px}.editable-checklist label input[type="checkbox"],.editable-checklist label span{vertical-align:middle;margin:0}.editable-checklist label{white-space:nowrap}.editable-wysihtml5{width:566px;height:250px}.editable-clear{clear:both;font-size:0.9em;text-decoration:none;text-align:right}.editable-clear-x{display:block;width:13px;height:13px;position:absolute;opacity:0.6;z-index:100;top:50%;right:6px;margin-top:-6px}.editable-clear-x:hover{opacity:1}.editable-pre-wrapped{white-space:pre-wrap}.editable-container.editable-popup{max-width:none !important}.editable-container.popover{width:auto}.editable-container.editable-inline{display:inline-block;vertical-align:middle;width:auto;zoom:1;*display:inline}.editable-container.ui-widget{font-size:inherit;z-index:9990}.editable-click,a.editable-click,a.editable-click:hover{text-decoration:none;border-bottom:dashed 1px #568a89}.editable-click.editable-disabled,a.editable-click.editable-disabled,a.editable-click.editable-disabled:hover{color:#585858;cursor:default;border-bottom:none}.editable-empty,.editable-empty:hover,.editable-empty:focus{font-style:italic;color:#d9534f;text-decoration:none}.editable-unsaved{font-weight:bold}.editable-bg-transition{-webkit-transition:background-color 1400ms ease-out;-moz-transition:background-color 1400ms ease-out;-o-transition:background-color 1400ms ease-out;-ms-transition:background-color 1400ms ease-out;transition:background-color 1400ms ease-out}.form-horizontal .editable{padding-top:5px;display:inline-block}/*! * Datepicker for Bootstrap * * Copyright 2012 Stefan Petre @@ -32,4 +32,4 @@ * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * - */.datepicker{padding:4px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker.datepicker-rtl{direction:rtl}.datepicker.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:6px}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:7px}.datepicker>div{display:none}.datepicker.days div.datepicker-days{display:block}.datepicker.months div.datepicker-months{display:block}.datepicker.years div.datepicker-years{display:block}.datepicker table{margin:0}.datepicker td,.datepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day:hover{background:#eeeeee;cursor:pointer}.datepicker table tr td.old,.datepicker table tr td.new{color:#999999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:none;color:#999999;cursor:default}.datepicker table tr td.today,.datepicker table tr td.today:hover,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-moz-linear-gradient(top, #fdd49a, #fdf59a);background-image:-ms-linear-gradient(top, #fdd49a, #fdf59a);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));background-image:-webkit-linear-gradient(top, #fdd49a, #fdf59a);background-image:-o-linear-gradient(top, #fdd49a, #fdf59a);background-image:linear-gradient(to bottom, #fdd49a,#fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#000}.datepicker table tr td.today:hover,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today[disabled],.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active{background-color:#fbf069 \9}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range:hover,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover{background:#eeeeee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover{background-color:#f3d17a;background-image:-moz-linear-gradient(top, #f3c17a, #f3e97a);background-image:-ms-linear-gradient(top, #f3c17a, #f3e97a);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));background-image:-webkit-linear-gradient(top, #f3c17a, #f3e97a);background-image:-o-linear-gradient(top, #f3c17a, #f3e97a);background-image:linear-gradient(to bottom, #f3c17a,#f3e97a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);border-color:#f3e97a #f3e97a #edde34;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled:hover[disabled]{background-color:#f3e97a}.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active{background-color:#efe24b \9}.datepicker table tr td.selected,.datepicker table tr td.selected:hover,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover{background-color:#9e9e9e;background-image:-moz-linear-gradient(top, #b3b3b3, gray);background-image:-ms-linear-gradient(top, #b3b3b3, gray);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(gray));background-image:-webkit-linear-gradient(top, #b3b3b3, gray);background-image:-o-linear-gradient(top, #b3b3b3, gray);background-image:linear-gradient(to bottom, #b3b3b3,#808080);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);border-color:#808080 #808080 #595959;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled:hover[disabled]{background-color:#808080}.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active{background-color:#666666 \9}.datepicker table tr td.active,.datepicker table tr td.active:hover,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top, #08c, #04c);background-image:-ms-linear-gradient(top, #08c, #04c);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));background-image:-webkit-linear-gradient(top, #08c, #04c);background-image:-o-linear-gradient(top, #08c, #04c);background-image:linear-gradient(to bottom, #0088cc,#0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.active:hover,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active[disabled],.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.datepicker table tr td span:hover{background:#eeeeee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:none;color:#999999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top, #08c, #04c);background-image:-ms-linear-gradient(top, #08c, #04c);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));background-image:-webkit-linear-gradient(top, #08c, #04c);background-image:-o-linear-gradient(top, #08c, #04c);background-image:linear-gradient(to bottom, #0088cc,#0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span.old,.datepicker table tr td span.new{color:#999999}.datepicker th.datepicker-switch{width:145px}.datepicker thead tr:first-child th,.datepicker tfoot tr th{cursor:pointer}.datepicker thead tr:first-child th:hover,.datepicker tfoot tr th:hover{background:#eeeeee}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datepicker thead tr:first-child th.cw{cursor:default;background-color:transparent}.input-append.date .add-on i,.input-prepend.date .add-on i{display:block;cursor:pointer;width:16px;height:16px}.input-daterange input{text-align:center}.input-daterange input:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-daterange input:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#eeeeee;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}.ui-pnotify{top:25px;right:25px;position:absolute;height:auto;z-index:9999}html>body>.ui-pnotify{position:fixed}.ui-pnotify .ui-pnotify-shadow{-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0px 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.ui-pnotify-container{background-position:0 0;padding:.8em;height:100%;margin:0}.ui-pnotify-sharp{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.ui-pnotify-title{display:block;margin-bottom:.4em;margin-top:0}.ui-pnotify-text{display:block;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.ui-pnotify-icon,.ui-pnotify-icon span{display:block;float:left;margin-right:.2em}.ui-pnotify.stack-topleft,.ui-pnotify.stack-bottomleft{left:25px;right:auto}.ui-pnotify.stack-bottomright,.ui-pnotify.stack-bottomleft{bottom:25px;top:auto}.ui-pnotify.stack-bar-top{right:0;top:0}.ui-pnotify.stack-bar-bottom{right:auto;bottom:0;top:auto;left:auto}html,body,#sb-site,.sb-site-container,.sb-slidebar{margin:0;padding:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{width:100%;overflow-x:hidden}html{height:100%}body{min-height:100%;height:auto;position:relative}html.sb-scroll-lock.sb-active:not(.sb-static){overflow:hidden}#sb-site,.sb-site-container{width:100%;position:relative;z-index:1;background:url("../img/pf-bg.jpg") #05050a;background-repeat:no-repeat}.sb-slidebar{height:100%;overflow-y:auto;position:fixed;top:0;z-index:0;display:none;background-color:#313335;-webkit-transform:translate(0px)}.sb-left{left:0;-webkit-box-shadow:inset -5px 0px 10px 0px rgba(0,0,0,0.4);box-shadow:inset -5px 0px 10px 0px rgba(0,0,0,0.4)}.sb-right{right:0;-webkit-box-shadow:inset 5px 0px 10px 0px rgba(0,0,0,0.4);box-shadow:inset 5px 0px 10px 0px rgba(0,0,0,0.4)}html.sb-static .sb-slidebar,.sb-slidebar.sb-static{position:absolute}.sb-slidebar.sb-active{display:block}.sb-style-overlay{z-index:9999}.sb-momentum-scrolling{-webkit-overflow-scrolling:touch}.sb-slidebar{width:30%}.sb-width-thin{width:15%}.sb-width-wide{width:45%}@media (max-width: 480px){.sb-slidebar{width:70%}.sb-width-thin{width:55%}.sb-width-wide{width:85%}}@media (min-width: 481px){.sb-slidebar{width:55%}.sb-width-thin{width:40%}.sb-width-wide{width:70%}}@media (min-width: 768px){.sb-slidebar{width:40%}.sb-width-thin{width:25%}.sb-width-wide{width:55%}}@media (min-width: 992px){.sb-slidebar{width:30%}.sb-width-thin{width:15%}.sb-width-wide{width:45%}}@media (min-width: 1200px){.sb-slidebar{width:20%}.sb-width-thin{width:5%}.sb-width-wide{width:35%}}.sb-slide,#sb-site,.sb-site-container,.sb-slidebar{-webkit-transition:-webkit-transform 400ms ease;-moz-transition:-moz-transform 400ms ease;-o-transition:-o-transform 400ms ease;transition:transform 400ms ease;-webkit-transition-property:-webkit-transform, left, right;-webkit-backface-visibility:hidden}.sb-hide{display:none}.pf-pie-chart{position:relative;display:table-cell;text-align:center;vertical-align:middle}.pf-pie-chart span{display:inline-block}.pf-pie-chart canvas{position:absolute;top:0;left:0}.pf-pie-chart-map-timer{width:36px;height:36px;margin:3px}.pf-pie-chart-map-timer canvas{top:3px;left:3px}.pf-pie-chart-map-timer span{font-size:10px}.pf-pie-chart-map-timer span:after{content:'s';margin-left:1px}div.pf-map-drag-to-select{background:#375959;display:none;opacity:0.3;z-index:9000;border:1px dashed #adadad;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}div.pf-map-drag-to-select.active{display:block}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;overflow:hidden;padding-left:8px;padding-right:20px;text-overflow:ellipsis}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{border:none;font-size:100%;margin-top:5px}.select2-dropdown{background-color:#313335;border:1px solid #63676a;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1500;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3)}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:10px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0;border-color:#568a89}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-container--default .select2-selection--single{background-color:#313335;border:1px solid #63676a;border-radius:0px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#adadad;line-height:28px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;color:#a52521}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#63676a}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#313335;border:1px solid #63676a;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#63676a;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#adadad;color:#2b2b2b;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#a52521;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0;-webkit-transition:border-color 0.3s ease-out;transition:border-color 0.3s ease-out;border-color:#568a89}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #63676a}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#375959;color:#eaeaea}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#adadad;color:#2b2b2b}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#313335;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #ffffff 50%,#eeeeee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff', endColorstr='#eee', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #adadad}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#63676a}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eeeeee 50%,#cccccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eee', endColorstr='#ccc', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #adadad}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #ffffff 0%,#eeeeee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff', endColorstr='#eee', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eeeeee 50%,#ffffff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eee', endColorstr='#fff', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #adadad}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#adadad;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #adadad}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#2b2b2b}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#adadad}html{margin:0;padding:0;height:100%;position:relative}body{margin:0;padding:0;min-height:100%;direction:ltr}body.mobile-view-activated.hidden-menu{overflow-x:hidden}body.modal-open{overflow:hidden !important}a:hover,a:active,a:focus,button,button:active,button:focus,object,embed,input::-moz-focus-inner{outline:0}h1,h3,h4{margin:0;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.page-title{margin:12px 0 28px}.page-title span{font-size:15px;color:#313335;display:inline-block;vertical-align:1px}label{font-weight:normal}*:focus{outline:0 !important}a,input,button{-ms-touch-action:none !important}textarea:focus,select:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{outline:0;outline:thin dotted \9;box-shadow:inset -1px 1px 6px 0 rgba(0,0,0,0.8) !important}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-group-sm>.input-group-btn>button.DTTT_button,.input-group-sm>.input-group-btn>div.DTTT_button,.input-group-sm>.input-group-btn>a.DTTT_button,.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-group-lg>.input-group-btn>button.DTTT_button,.input-group-lg>.input-group-btn>div.DTTT_button,.input-group-lg>.input-group-btn>a.DTTT_button,.input-xs,.form-control{border-radius:0px !important;-webkit-border-radius:0px !important;-moz-border-radius:0px !important}.input-xs{height:24px;padding:2px 10px;font-size:11px;line-height:1.5}.btn-xs,.btn-group-xs>.btn,.btn-group-xs>button.DTTT_button,.btn-group-xs>div.DTTT_button,.btn-group-xs>a.DTTT_button{padding:0px 2px;font-size:10px;line-height:1.3}.btn-sm,.btn-group-sm>.btn,.btn-group-sm>button.DTTT_button,.btn-group-sm>div.DTTT_button,.btn-group-sm>a.DTTT_button,button.DTTT_button,div.DTTT_button,a.DTTT_button{padding:6px 10px 5px}.btn-lg,.btn-group-lg>.btn,.btn-group-lg>button.DTTT_button,.btn-group-lg>div.DTTT_button,.btn-group-lg>a.DTTT_button{padding:10px 16px}.no-space{margin:0}.no-space>[class*="col-"]{margin:0 !important;padding-right:0;padding-left:0}h1{letter-spacing:-1px;font-size:22px;margin:10px 0}h1 small{font-size:12px;font-weight:300;letter-spacing:-1px}.lead{font-size:13px}h2{font-family:"Oxygen", "Open Sans", Arial, Helvetica, Sans-Serif;letter-spacing:0px;font-size:14px;margin:20px 0;line-height:normal}h3{display:block;font-size:17px;font-weight:400;margin:20px 0;line-height:normal}h4{line-height:normal;margin:20px 0 10px 0}h5{font-size:15px;font-weight:300;margin:10px 0;line-height:normal}h6{font-size:13px;margin:10px 0;font-weight:bold;line-height:normal}.row-seperator-header{margin:15px 14px 20px;border-bottom:none;display:block;color:#303133;font-size:20px;font-weight:400}.center-canvas,.center-child-canvas>canvas{display:block !important;margin:0 auto !important}.smart-accordion-default.panel-group{margin-bottom:0px}.smart-accordion-default.panel-group .panel+.panel{margin-top:-1px}.smart-accordion-default.panel-group .panel-heading{padding:0px}.smart-accordion-default.panel-group .panel-title a{display:block;padding:10px 15px;text-decoration:none !important}.smart-accordion-default .panel-heading,.panel-group .panel{border-radius:0px;-webkit-border-radius:0px;-moz-border-radius:0px}.smart-accordion-default .panel-default>.panel-heading{background-color:#f3f3f3}.smart-accordion-default .panel-default{border-color:#8d9194}.smart-accordion-default .panel-title>a>:first-child{display:none}.smart-accordion-default .panel-title>a.collapsed>.fa{display:none}.smart-accordion-default .panel-title>a.collapsed>:first-child{display:inline-block}.no-padding .smart-accordion-default>div{border-left:none !important;border-right:none !important}.no-padding .smart-accordion-default>div:first-child{border-top:none !important}.no-padding .smart-accordion-default>div:last-child{border-bottom:none !important}.onoffswitch-container{margin-top:4px;margin-left:7px;display:inline-block}.onoffswitch{position:relative;width:50px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;margin-top:3px;margin-bottom:3px;margin-left:5px;display:inline-block;vertical-align:middle}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:1px solid #484c4e;border-radius:50px;border-color:#777b7f #7c8184 #686c6f;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.onoffswitch-inner{width:200%;margin-left:-100%;display:block}.onoffswitch-inner:before,.onoffswitch-inner:after{float:left;width:50%;height:15px;padding:0;line-height:15px;font-size:10px;color:#fff;font-family:Trebuchet, Arial, sans-serif;font-weight:bold;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.onoffswitch-inner:before{content:attr(data-swchon-text);text-shadow:0 -1px 0 #313335;padding-left:7px;background-color:#3276b1;color:#fff;box-shadow:inset 0 2px 6px rgba(0,0,0,0.5),0 1px 2px rgba(0,0,0,0.05);text-align:left}.onoffswitch-inner:after{content:attr(data-swchoff-text);padding-right:7px;text-shadow:0 -1px 0 #fff;background-color:#fff;color:#3c3f41;text-align:right;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.onoffswitch-switch{width:19px;height:19px;margin:-2px;background:white;border:1px solid #64686b;border-radius:50px;position:absolute;top:0;bottom:0;right:32px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background-color:#eaeaea;background-image:-moz-linear-gradient(top, #fff, #adadad);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#adadad));background-image:-webkit-linear-gradient(top, #fff, #adadad);background-image:-o-linear-gradient(top, #fff, #adadad);background-image:linear-gradient(to bottom, #ffffff,#adadad);background-repeat:repeat-x;-webkit-box-shadow:1px 1px 4px 0px rgba(0,0,0,0.3);box-shadow:1px 1px 4px 0px rgba(0,0,0,0.3)}.onoffswitch-checkbox+.onoffswitch-label .onoffswitch-switch:before,.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch:before{content:"\f00d";color:#a52521;display:block;text-align:center;line-height:19px;font-size:10px;text-shadow:0 -1px 0 #fff;font-weight:bold;font-family:FontAwesome}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch:before{content:"\f00c";color:#428bca}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0;display:block}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0px}.onoffswitch-switch:hover{background-color:#adadad}.onoffswitch-switch:active{background-color:#adadad;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.onoffswitch-checkbox:disabled+.onoffswitch-label .onoffswitch-inner:after,.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-inner:before{text-shadow:0 1px 0 #fff;background:#bfbfbf;color:#313335}.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-switch,.onoffswitch-checkbox:disabled+.onoffswitch-label .onoffswitch-switch{background-color:#eaeaea;background-image:-moz-linear-gradient(top, #bfbfbf, #eaeaea);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#bfbfbf), to(#eaeaea));background-image:-webkit-linear-gradient(top, #bfbfbf, #eaeaea);background-image:-o-linear-gradient(top, #bfbfbf, #eaeaea);background-image:linear-gradient(to bottom, #bfbfbf,#eaeaea);box-shadow:none !important}.onoffswitch-checkbox:disabled+.onoffswitch-label,.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-label{border-color:#74797c #63676a #525558 !important}.onoffswitch-checkbox:checked+.onoffswitch-label{border-color:#3276b1 #2a6395 #255681}.onoffswitch+span,.onoffswitch-title{display:inline-block;vertical-align:middle;margin-top:-5px}.form-control{box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.form hr{margin-left:-13px;margin-right:-13px;border-color:rgba(0,0,0,0.1);margin-top:20px;margin-bottom:20px}.form fieldset{display:block;border:none;background:rgba(255,255,255,0.9);position:relative}fieldset{position:relative}.form-actions{display:block;padding:13px 14px 15px;border-top:1px solid rgba(0,0,0,0.1);background:rgba(239,239,239,0.9);margin-top:25px;margin-left:-13px;margin-right:-13px;margin-bottom:-13px;text-align:right}.well .form-actions{margin-left:-19px;margin-right:-19px;margin-bottom:-19px}.well.well-lg .form-actions{margin-left:-24px;margin-right:-24px;margin-bottom:-24px}.well.well-sm .form-actions{margin-left:-9px;margin-right:-9px;margin-bottom:-9px}.popover-content .form-actions{margin:0 -14px -9px;border-radius:0 0 3px 3px;padding:9px 14px}.no-padding .form .form-actions{margin:0;display:block;padding:13px 14px 15px;border-top:1px solid rgba(0,0,0,0.1);background:rgba(248,248,248,0.9);text-align:right;margin-top:25px}.form header,legend{display:block;padding:8px 0;border-bottom:1px dashed rgba(0,0,0,0.2);background:#fff;font-size:16px;font-weight:300;color:#2b2b2b;margin:25px 0px 20px}.no-padding .form header{margin:25px 14px 0}.form header:first-child{margin-top:10px}legend{font-weight:400;margin-top:0px;background:none}.input-group-addon{padding:6px 10px;border-radius:0;-moz-border-radius:0;-webkit-border-radius:0}.input-group-addon{transition:border-color 0.3s;-o-transition:border-color 0.3s;-ms-transition:border-color 0.3s;-moz-transition:border-color 0.3s;-webkit-transition:border-color 0.3s;transition:background-color 0.3s;-o-transition:background-color 0.3s;-ms-transition:background-color 0.3s;-moz-transition:background-color 0.3s;-webkit-transition:background-color 0.3s}.input-group-addon .fa{font-size:14px}.input-group-addon .fa-lg,.input-group-addon .fa-2x{font-size:2em}.input-group-addon .fa-3x,.input-group-addon .fa-4x,.input-group-addon .fa-5x{font-size:30px}input[type="text"]:focus+.input-group-addon{border-color:#0091d9;background-color:#666;color:#fff}.has-warning input[type="text"],.has-warning input[type="text"]+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]+.input-group-addon{background-color:#fdedd8;color:#2b2b2b}.has-warning input[type="text"]:focus,.has-warning input[type="text"]:focus+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]:focus+.input-group-addon{background-color:#f29717;color:#fff}.has-error .input-group-addon{border-color:#a52521;background:#f6d1d0;color:#2b2b2b}.has-error input[type="text"],.has-error input[type="text"]+.input-group-addon{border-color:#a52521}.has-error input[type="text"]+.input-group-addon{background-color:#f6d1d0;color:#2b2b2b}.has-error input[type="text"]:focus,.has-error input[type="text"]:focus+.input-group-addon{border-color:#d8403b}.has-error input[type="text"]:focus+.input-group-addon{background-color:#d8403b;color:#fff}.has-success input[type="text"]:focus+.input-group-addon{border-color:#4f9e4f;background-color:#4f9e4f;color:#fff}.form fieldset .form-group:last-child,.form fieldset .form-group:last-child .note,.form .form-group:last-child,.form .form-group:last-child .note{margin-bottom:0}.note{margin-top:6px;padding:0 1px;font-size:11px;line-height:15px;color:#63676a}.input-icon-right{position:relative}.input-icon-right>i,.input-icon-left>i{position:absolute;right:10px;top:30%;font-size:16px;color:#bfbfbf}.input-icon-left>i{right:auto;left:24px}.input-icon-right .form-control{padding-right:27px}.input-icon-left .form-control{padding-left:29px}input[type="text"].ui-autocomplete-loading,input[type="password"].ui-autocomplete-loading,input[type="datetime"].ui-autocomplete-loading,input[type="datetime-local"].ui-autocomplete-loading,input[type="date"].ui-autocomplete-loading,input[type="month"].ui-autocomplete-loading,input[type="time"].ui-autocomplete-loading,input[type="week"].ui-autocomplete-loading,input[type="number"].ui-autocomplete-loading,input[type="email"].ui-autocomplete-loading,input[type="url"].ui-autocomplete-loading,input[type="search"].ui-autocomplete-loading,input[type="tel"].ui-autocomplete-loading,input[type="color"].ui-autocomplete-loading{background-image:url("../img/select2-spinner.gif") !important;background-repeat:no-repeat;background-position:99% 50%;padding-right:27px}.input-group-addon .checkbox,.input-group-addon .radio{min-height:0px;margin-right:0px !important;padding-top:0}.input-group-addon label input[type="checkbox"].checkbox+span,.input-group-addon label input[type="radio"].radiobox+span,.input-group-addon label input[type="radio"].radiobox+span:before,.input-group-addon label input[type="checkbox"].checkbox+span:before{margin-right:0px}.input-group-addon .onoffswitch,.input-group-addon .onoffswitch-label{margin:0}.alert{margin-bottom:10px;margin-top:0px;padding:5px 15px 5px 34px;color:#675100;border-width:0px;border-left-width:3px;padding:10px}.alert .ui-pnotify-title{line-height:12px}.alert .ui-pnotify-text{font-size:10px}.alert .close{top:0px;right:-5px;line-height:20px}.alert-heading{font-weight:600}.alert-danger{border-color:#a52521;color:#2b2b2b;background:#f6d1d0;text-shadow:none}.alert-danger .ui-pnotify-icon{color:#a52521}.alert-warning{border-color:#e28a0d;color:#2b2b2b;background:#fef8f0}.alert-warning .ui-pnotify-icon{color:#e28a0d}.alert-success{border-color:#4f9e4f;color:#2b2b2b;background:#d1e8d1}.alert-success .ui-pnotify-icon{color:#4f9e4f}.alert-info{border-color:#316490;color:#2b2b2b;background:#abc9e2}.alert-info .ui-pnotify-icon{color:#316490}.progress-micro{height:3px !important;line-height:3px !important}.progress-xs{height:7px !important;line-height:7px !important}.progress-sm{height:14px !important;line-height:14px !important}.progress-lg{height:30px !important;line-height:30px !important}.progress .progress-bar{position:absolute;overflow:hidden;line-height:18px}.progress .progressbar-back-text{position:absolute;width:100%;height:100%;font-size:12px;line-height:20px;text-align:center}.progress .progressbar-front-text{display:block;width:100%;font-size:12px;line-height:20px;text-align:center}.progress.right .progress-bar{right:0}.progress.right .progressbar-front-text{position:absolute;right:0}.progress.vertical{width:25px;height:100%;min-height:150px;margin-right:20px;display:inline-block;margin-bottom:0px}.progress.wide-bar{width:40px}.progress.vertical.bottom{position:relative}.progress.vertical.bottom .progressbar-front-text{position:absolute;bottom:0}.progress.vertical .progress-bar{width:100%;height:0;-webkit-transition:height 0.6s ease;transition:height 0.6s ease}.progress.vertical.bottom .progress-bar{position:absolute;bottom:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{position:relative;margin-bottom:20px;overflow:hidden;height:18px;background:#adadad;box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;-webkit-box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;-moz-box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;border-radius:0px;-moz-border-radius:0px;-webkit-border-radius:0px}.progress-bar{float:left;width:0;height:100%;font-size:11px;color:#fff;text-align:center;background-color:#428bca;-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);font-weight:bold;text-shadow:0 -1px 0 rgba(0,0,0,0.25);-webkit-transition:width 1.5s ease-in-out;transition:width 1.5s ease-in-out}.progress-striped .progress-bar{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));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:-moz-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%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-danger{background-color:#a52521}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));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:-moz-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%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-success{background-color:#4f9e4f}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));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:-moz-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%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-warning{background-color:#e28a0d}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));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:-moz-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%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-info{background-color:#316490}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));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:-moz-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%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-info .bar,.progress .bar-info{background:#316490}.vertical-bars{padding:0;margin:0}.vertical-bars:after{content:"";display:block;height:0;clear:both}.vertical-bars li{padding:14px 0;width:25%;display:block;float:left;text-align:center}.vertical-bars li:first-child{border-left:none}.vertical-bars>li>.progress.vertical:first-child{margin-left:auto}.vertical-bars>li>.progress.vertical{margin:0 auto;float:none}.nav-tabs{border-bottom:none}.nav-tabs>li>a .badge{font-size:11px;padding:3px 5px 3px 5px;opacity:.5;margin-left:5px;min-width:17px;font-weight:normal}.tabs-left .nav-tabs>li>a .badge{margin-right:5px;margin-left:0px}.nav-tabs>li>a .label{display:inline-block;font-size:11px;margin-left:5px;opacity:.5}.nav-tabs>li>a{color:#adadad;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.nav-tabs>li>a:hover{color:#1d1d1d;border-color:transparent transparent #adadad transparent;margin-top:1px;border-top-width:0}.nav-tabs>li.active>a{background-color:#adadad;color:#2b2b2b;border-top-width:0px !important;margin-top:1px !important;font-weight:bold}.tabs-left .nav-tabs>li.active>a{-webkit-box-shadow:-2px 0 0 #428bca;-moz-box-shadow:-2px 0 0 #428bca;box-shadow:-2px 0 0 #428bca;border-top-width:1px !important;border-left:none !important;margin-left:1px !important}.tabs-left .nav-pills>li.active>a{border:none !important;box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.tabs-right .nav-tabs>li.active>a{-webkit-box-shadow:2px 0 0 #428bca;-moz-box-shadow:2px 0 0 #428bca;box-shadow:2px 0 0 #428bca;border-top-width:1px !important;border-right:none !important;margin-right:1px !important}.tabs-below .nav-tabs>li.active>a{-webkit-box-shadow:0 2px 0 #428bca;-moz-box-shadow:0 2px 0 #428bca;box-shadow:0 2px 0 #428bca;border-bottom-width:0px !important;border-top:none !important;margin-top:0px !important}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li,.tabs-left>.nav-pills>li,.tabs-right>.nav-pills>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a,.tabs-left>.nav-pills>li>a,.tabs-right>.nav-pills>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs,.tabs-left>.nav-pills{float:left;margin-right:19px;border-right:1px solid #9b9b9b}.tabs-left>.nav-pills{border-right:none}.tabs-left>.nav-tabs>li>a{margin-right:-1px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#adadad #949494 #adadad #adadad}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#949494 transparent #949494 #9b9b9b;*border-right-color:#fff}.tabs-left>.tab-content{margin-left:109px}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #9b9b9b}.tabs-right>.nav-tabs>li>a{margin-left:-1px}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#adadad #adadad #adadad #9b9b9b}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#9b9b9b #9b9b9b #9b9b9b transparent;*border-left-color:#fff}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#9b9b9b;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #9b9b9b #9b9b9b #9b9b9b}.nav-tabs.bordered{background:#fff;border:1px solid #9b9b9b}.nav-tabs.bordered>:first-child a{border-left-width:0px !important}.nav-tabs.bordered+.tab-content{border:1px solid #9b9b9b;border-top:none}.tabs-pull-right.nav-tabs>li,.tabs-pull-right.nav-pills>li{float:right}.tabs-pull-right.nav-tabs>li:first-child>a,.tabs-pull-right.nav-pills>li:first-child>a{margin-right:1px}.tabs-pull-right.bordered.nav-tabs>li:first-child>a,.tabs-pull-right.bordered.nav-pills>li:first-child>a{border-left-width:1px !important;margin-right:0px;border-right-width:0px}.dropdown-menu-xs{min-width:37px}.dropdown-menu-xs>li>a{padding:3px 10px}.dropdown-menu-xs>li>a:hover i{color:#fff !important}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#2b2b2b;margin-top:5px;margin-right:-10px}.dropdown-submenu:hover>a:after{border-left-color:#adadad}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px}.pagination>li>a,.pagination>li>span{box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-moz-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05)}.disabled{color:#fff}.btn-default.disabled,button.disabled.DTTT_button,div.disabled.DTTT_button,a.disabled.DTTT_button{color:#63676a}.btn,button.DTTT_button,div.DTTT_button,a.DTTT_button{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px;box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-moz-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05)}.btn:active,button.DTTT_button:active,div.DTTT_button:active,a.DTTT_button:active{position:relative;top:1px;left:1px}.btn.btn-ribbon,button.btn-ribbon.DTTT_button,div.btn-ribbon.DTTT_button,a.btn-ribbon.DTTT_button{background-color:#707070;background-image:-moz-linear-gradient(top, #777, #666);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#777), to(#666));background-image:-webkit-linear-gradient(top, #777, #666);background-image:-o-linear-gradient(top, #777, #666);background-image:linear-gradient(to bottom, #777777,#666666);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff777777', endColorstr='#ff666666', GradientType=0);color:white;padding:0 5px;line-height:20px;vertical-align:middle;height:20px;display:block;border:none;float:left;margin:0 8px 0 0;cursor:pointer}.btn.btn-ribbon>i,button.btn-ribbon.DTTT_button>i,div.btn-ribbon.DTTT_button>i,a.btn-ribbon.DTTT_button>i{font-size:111%}.ribbon-button-alignment{padding-top:10px;display:inline-block}.ribbon-button-alignment.pull-right>.btn.btn-ribbon,.ribbon-button-alignment.pull-right>button.btn-ribbon.DTTT_button,.ribbon-button-alignment.pull-right>div.btn-ribbon.DTTT_button,.ribbon-button-alignment.pull-right>a.btn-ribbon.DTTT_button{margin:0 0 0 8px}.panel-purple{border-color:#6e587a}.panel-purple>.panel-heading{color:#fff;background-color:#6e587a;border-color:#6e587a}.panel-greenLight{border-color:#71843f}.panel-greenLight>.panel-heading{color:#fff;background-color:#71843f;border-color:#71843f}.panel-greenDark{border-color:#496949}.panel-greenDark>.panel-heading{color:#fff;background-color:#496949;border-color:#496949}.panel-darken{border-color:#313335}.panel-darken>.panel-heading{color:#fff;background-color:#404040;border-color:#404040}.panel-pink{border-color:#e06fdf}.panel-pink>.panel-heading{color:#fff;background-color:#e06fdf;border-color:#e06fdf}.panel-green{border-color:#5cb85c}.panel-green>.panel-heading{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.panel-blueLight{border-color:#92a2a8}.panel-blueLight>.panel-heading{color:#fff;background-color:#92a2a8;border-color:#92a2a8}.panel-pinkDark{border-color:#a8829f}.panel-pinkDark>.panel-heading{color:#fff;background-color:#a8829f;border-color:#a8829f}.panel-redLight{border-color:#a65858}.panel-redLight>.panel-heading{color:#fff;background-color:#a65858;border-color:#a65858}.panel-red{border-color:#d9534f}.panel-red>.panel-heading{color:#fff;background-color:#d9534f;border-color:#d9534f}.panel-teal{border-color:#568a89}.panel-teal>.panel-heading{color:#fff;background-color:#568a89;border-color:#568a89}.panel-orange{border-color:#e28a0d}.panel-orange>.panel-heading{color:#fff;background-color:#e28a0d;border-color:#e28a0d}.panel-blueDark{border-color:#4c4f53}.panel-blueDark>.panel-heading{color:#fff;background-color:#4c4f53;border-color:#4c4f53}.panel-magenta{border-color:#6e3671}.panel-magenta>.panel-heading{color:#fff;background-color:#6e3671;border-color:#6e3671}.panel-blue{border-color:#428bca}.panel-blue>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-footer>.btn-block{border-radius:0px;-moz-border-radius:0px;-webkit-border-radius:0px;border-bottom:none;border-left:none;border-right:none}.btn-circle{width:30px;height:30px;text-align:center;padding:6px 0;font-size:12px;line-height:18px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-lg,.btn-group-lg>.btn-circle.btn,.btn-group-lg>button.btn-circle.DTTT_button,.btn-group-lg>div.btn-circle.DTTT_button,.btn-group-lg>a.btn-circle.DTTT_button{width:50px;height:50px;padding:10px 15px;font-size:18px;line-height:30px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 15px;font-size:24px;line-height:50px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-metro{margin:0 0 20px;padding-top:15px;padding-bottom:15px}.btn-metro>span{display:block;vertical-align:bottom;margin-top:10px;text-transform:uppercase}.btn-metro>span.label{position:absolute;top:0px;right:0px}.btn-label{position:relative;left:-12px;display:inline-block;padding:6px 12px;background:rgba(0,0,0,0.15);border-radius:3px 0 0 3px}.btn-labeled{padding-top:0;padding-bottom:0}.btn-link{box-shadow:none;-webkit-box-shadow:none;font-size:13px}.morris-hover.morris-default-style{border-radius:5px;padding:5px;color:#666;background:rgba(29,29,29,0.9);border:solid 2px #375959;font-family:'Oxygen Bold';font-size:10px;text-align:left;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap}.morris-hover{position:absolute;z-index:903}.fixed-page-footer .morris-hover{z-index:900}.txt-color.txt-color-blue{color:#428bca !important}.txt-color.txt-color-blueLight{color:#92a2a8 !important}.txt-color.txt-color-blueDark{color:#4c4f53 !important}.txt-color.txt-color-grayLightest{color:#eaeaea !important}.txt-color.txt-color-grayLight{color:#63676a !important}.txt-color.txt-color-gray{color:#3c3f41 !important}.txt-color.txt-color-grayDark{color:#313335 !important}.txt-color.txt-color-green,.txt-color.pf-log-info{color:#5cb85c !important}.txt-color.txt-color-greenLight{color:#71843f !important}.txt-color.txt-color-greenDark{color:#496949 !important}.txt-color.txt-color-red,.txt-color.pf-log-error{color:#d9534f !important}.txt-color.txt-color-yellow{color:#b09b5b !important}.txt-color.txt-color-orange{color:#e28a0d !important}.txt-color.txt-color-orangeDark{color:#c2760c !important}.txt-color.txt-color-pink{color:#e06fdf !important}.txt-color.txt-color-pinkDark{color:#a8829f !important}.txt-color.txt-color-purple{color:#6e587a !important}.txt-color.txt-color-darken{color:#404040 !important}.txt-color.txt-color-lighten{color:#d5e7ec !important}.txt-color.txt-color-white{color:#fff !important}.txt-color.txt-color-magenta{color:#6e3671 !important}.txt-color.txt-color-teal{color:#568a89 !important}.txt-color.txt-color-redLight{color:#a65858 !important}.txt-color.txt-color-primary{color:#375959 !important}.txt-color.txt-color-success{color:#4f9e4f !important}.txt-color.txt-color-information{color:#316490 !important}.txt-color.txt-color-warning,.txt-color.pf-log-warning{color:#e28a0d !important}.txt-color.txt-color-danger{color:#a52521 !important}.bg-color.bg-color-blue{background-color:#428bca !important}.bg-color.bg-color-blueLight{background-color:#92a2a8 !important}.bg-color.bg-color-blueDark{background-color:#4c4f53 !important}.bg-color.bg-color-green{background-color:#5cb85c !important}.bg-color.bg-color-greenLight{background-color:#71843f !important}.bg-color.bg-color-greenDark{background-color:#496949 !important}.bg-color.bg-color-red{background-color:#d9534f !important}.bg-color.bg-color-yellow{background-color:#b09b5b !important}.bg-color.bg-color-orange{background-color:#e28a0d !important}.bg-color.bg-color-orangeDark{background-color:#c2760c !important}.bg-color.bg-color-pink{background-color:#e06fdf !important}.bg-color.bg-color-pinkDark{background-color:#a8829f !important}.bg-color.bg-color-purple{background-color:#6e587a !important}.bg-color.bg-color-darken{background-color:#404040 !important}.bg-color.bg-color-lighten{background-color:#d5e7ec !important}.bg-color.bg-color-white{background-color:#fff !important}.bg-color.bg-color-grayDark{background-color:#525252 !important}.bg-color.bg-color-magenta{background-color:#6e3671 !important}.bg-color.bg-color-teal{background-color:#568a89 !important}.bg-color.bg-color-redLight{background-color:#a65858 !important}body{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}a{color:#477372}a:hover{color:#6caead}em{font-style:italic}em.pf-brand{text-transform:uppercase}.pf-loading-overlay{position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;background:#2b2b2b;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-loading-overlay .pf-loading-overlay-wrapper{width:25px;height:25px;margin:auto;text-align:center;position:absolute;top:0;left:0;bottom:0;right:0}.pf-loading-overlay .pf-loading-overlay-wrapper i{padding:3px}.sb-left .list-group-item{-webkit-box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4)}.sb-right .list-group-item{-webkit-box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4)}.pf-map-type-global{color:#568a89}.pf-map-type-alliance{color:#428bca}.pf-map-type-private{color:#5cb85c}#pf-map-module{margin:20px 10px 0 10px}#pf-map-module #pf-map-tabs .pf-map-type-tab-default{border-top:2px solid transparent}#pf-map-module #pf-map-tabs .pf-map-type-tab-global{border-top:2px solid #5cb85c}#pf-map-module #pf-map-tabs .pf-map-type-tab-alliance{border-top:2px solid #428bca}#pf-map-module #pf-map-tabs .pf-map-type-tab-private{border-top:2px solid #568a89}.pf-map-content-row{margin:10px 0 0 0;padding-bottom:40px}.pf-map-content-row .pf-module{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;background:rgba(60,63,65,0.3);padding:10px;width:100%;margin-bottom:10px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-system-effect{display:none;cursor:default;color:#adadad}.pf-system-effect-magnetar{color:#e06fdf;display:inline-block}.pf-system-effect-redgiant{color:#d9534f;display:inline-block}.pf-system-effect-pulsar{color:#428bca;display:inline-block}.pf-system-effect-wolfryet{color:#e28a0d;display:inline-block}.pf-system-effect-cataclysmic{color:#ffb;display:inline-block}.pf-system-effect-blackhole{color:#1d1d1d;display:inline-block}.pf-system-info-rally .pf-system-head{background-color:#782d77;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjEuMCIgeTE9IjEuMCIgeDI9IjAuMCIgeTI9IjAuMCI+PHN0b3Agb2Zmc2V0PSIyNSUiIHN0b3AtY29sb3I9IiMzZTI2NGUiLz48c3RvcCBvZmZzZXQ9IjI1JSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzNlMjY0ZSIvPjxzdG9wIG9mZnNldD0iNzUlIiBzdG9wLWNvbG9yPSIjM2UyNjRlIi8+PHN0b3Agb2Zmc2V0PSI3NSUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMC4wIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAuMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-moz-linear-gradient(135deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-webkit-linear-gradient(135deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:linear-gradient(-45deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:25px 25px;-webkit-animation:move 3s linear infinite;-moz-animation:move 3s linear infinite;-ms-animation:move 3s linear infinite;animation:move 3s linear infinite}.pf-system-security-0-0{color:#be0000}.pf-system-security-0-1{color:#ab2600}.pf-system-security-0-2{color:#be3900}.pf-system-security-0-3{color:#c24e02}.pf-system-security-0-4{color:#ab5f00}.pf-system-security-0-5{color:#bebe00}.pf-system-security-0-6{color:#73bf26}.pf-system-security-0-7{color:#00bf00}.pf-system-security-0-8{color:#00bf39}.pf-system-security-0-9{color:#39bf99}.pf-system-security-1-0{color:#28c0bf}.pf-system-sec{margin-right:5px;cursor:-moz-grab;cursor:-webkit-grab}.pf-system-sec-highSec{color:#5cb85c}.pf-system-sec-lowSec{color:#e28a0d}.pf-system-sec-nullSec{color:#d9534f}.pf-system-sec-high{color:#d9534f}.pf-system-sec-mid{color:#e28a0d}.pf-system-sec-low{color:#428bca}.pf-system-status-friendly{border-color:#428bca !important;color:#428bca}.pf-system-status-occupied{border-color:#e28a0d !important;color:#e28a0d}.pf-system-status-hostile{border-color:#d9534f !important;color:#d9534f}.pf-system-status-empty{border-color:#5cb85c !important;color:#5cb85c}.pf-system-status-unscanned{border-color:#568a89 !important;color:#568a89}.pf-system-effect-dialog-wrapper .table,.pf-jump-info-dialog .table{margin:15px 0}.pf-system-effect-dialog-wrapper .table td,.pf-jump-info-dialog .table td{text-transform:capitalize}.pf-fake-connection{box-sizing:content-box;display:inline-block;width:70px;height:4px;margin-right:5px;border-top:2px solid #63676a;border-bottom:2px solid #63676a;background-color:#3c3f41;position:relative;font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-fake-connection.pf-map-connection-stargate{background-color:#63676a;border-color:#63676a}.pf-fake-connection.pf-map-connection-jumpbridge{background-color:#6caead;border-color:#3c3f41;background:repeating-linear-gradient(to right, #6caead, #6caead 10px, #3c3f41 10px, #3c3f41 20px)}.pf-fake-connection.pf-map-connection-wh-eol{border-color:#d747d6}.pf-fake-connection.pf-map-connection-wh-reduced{background-color:#e28a0d}.pf-fake-connection.pf-map-connection-wh-critical{background-color:#a52521}.pf-fake-connection.pf-map-connection-frig{border-style:dashed;border-left:none;border-right:none}.pf-fake-connection.pf-map-connection-frig:after{content:'frig';background-color:#e28a0d;color:#1d1d1d;padding:0px 3px;position:absolute;left:25px;top:-6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.pf-fake-connection.pf-map-connection-preserve-mass:after{content:'save mass';background-color:#a52521;color:#eaeaea;padding:0px 3px;position:absolute;left:9px;top:-6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.tooltip-inner{color:#5cb85c;background-color:#3c3f41;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;padding:5px 5px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.tooltip.top .tooltip-arrow{border-top-color:#63676a}.tooltip.right .tooltip-arrow{border-right-color:#63676a}.tooltip.bottom .tooltip-arrow{border-bottom-color:#63676a}.tooltip.left .tooltip-arrow{border-left-color:#63676a}#pf-head{margin-bottom:0px}#pf-head a:focus{color:#477372}#pf-head a:hover{text-decoration:none}#pf-head a:hover .badge{color:#6caead}#pf-head i{margin-right:2px}#pf-head .pf-head-menu .pf-head-menu-logo{width:18px;height:18px;display:inline-block;float:left;background:url('data:image/png;base64,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')}#pf-head .pf-head-menu:hover .pf-head-menu-logo{background:url('data:image/png;base64,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')}#pf-head .pf-head-menu:focus .pf-head-menu-logo{background:url('data:image/png;base64,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')}#pf-head .badge{background-color:#3c3f41;color:#adadad}#pf-head .pf-head-active-user,#pf-head .pf-head-current-location{display:none}#pf-head .pf-head-active-user .badge,#pf-head .pf-head-current-location .badge{-webkit-transition:color 0.3s ease-out;transition:color 0.3s ease-out}#pf-head .pf-head-program-status{cursor:pointer}#pf-footer{position:absolute;bottom:0;left:0;width:100%;margin:0;background:rgba(60,63,65,0.3)}#pf-footer a{font-family:"Oxygen" Georgia,"Times New Roman",Times,serif;color:#375959}#pf-footer a:hover{color:#477372;text-decoration:none}@-webkit-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-moz-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-ms-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-webkit-keyframes bounce{0%, 20%, 50%, 80%, 100%{-webkit-transform:translateY(0)}40%{-webkit-transform:translateY(-8px)}60%{-webkit-transform:translateY(-4px)}}@keyframes bounce{0%, 20%, 50%, 80%, 100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}.pf-map-tab-content .pf-map-wrapper{position:relative;width:100%;max-width:2515px;height:550px;overflow:auto;padding:5px;background:rgba(43,43,43,0.93);box-shadow:inset -3px 3px 10px 0 rgba(0,0,0,0.3);border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-width:1px;border-style:solid;border-color:#adadad}.pf-map-overlay{position:absolute;display:none;z-index:10000;width:36px;height:36px;bottom:23px;right:10px;background:rgba(0,0,0,0.2);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-grid-small{background:url('data:image/png;base64,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') !important}.pf-map{width:2500px;height:520px;position:relative;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-map ._jsPlumb_overlay{opacity:1;pointer-events:none}.pf-map ._jsPlumb_hover._jsPlumb_overlay{opacity:0}.pf-map ._jsPlumb_hover:not(._jsPlumb_overlay){-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:0.5s;animation-delay:0.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:linear;animation-timing-function:linear;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-webkit-animation-name:bounce;animation-name:bounce}.pf-map ._jsPlumb_target_hover,.pf-map ._jsPlumb_source_hover{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:0.5s;animation-delay:0.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:linear;animation-timing-function:linear;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-webkit-animation-name:bounce;animation-name:bounce;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3)}.pf-map .pf-system{position:absolute;min-width:60px;height:auto;background-color:#313335;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:100;border-width:2px;border-style:solid;border-color:#63676a;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-webkit-transition:border-color 0.5s ease-out,box-shadow 0.2s ease-out;transition:border-color 0.5s ease-out,box-shadow 0.2s ease-out;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.pf-map .pf-system:hover{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3);-moz-transform:translate3d(0, -2px, 0);-ms-transform:translate3d(0, -2px, 0);-webkit-transform:translate3d(0, -2px, 0);transform:translate3d(0, -2px, 0)}.pf-map .pf-system .pf-system-head{padding:0px 3px 0px 3px;cursor:pointer;font-family:Arial;font-weight:bold}.pf-map .pf-system .pf-system-head .pf-system-head-name{border:none;display:inline-block;min-width:41px;color:#adadad;margin-right:2px}.pf-map .pf-system .pf-system-head .fa-lock{display:none}.pf-map .pf-system .pf-system-head .pf-system-head-expand{margin-left:2px;color:#63676a;display:none}.pf-map .pf-system .pf-system-body{height:0px;width:100%;overflow:hidden;cursor:-moz-grab;cursor:-webkit-grab;cursor:grab;padding:0 2px;white-space:nowrap;display:none;border-top-width:1px;border-top-style:dashed;border-top-color:#63676a}.pf-map .pf-system .pf-system-body .pf-system-body-item{color:#63676a;font-size:10px}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-system-body-right{text-overflow:ellipsis;float:right;color:#568a89;display:none}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-user-status{font-size:7px}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-user-status-corp{color:#5cb85c}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-user-status-ally{color:#428bca}.pf-map .pf-system .tooltip.in{opacity:1}.pf-map .pf-system .tooltip .tooltip-inner{color:#313335;background-color:#adadad;padding:3px 3px}.pf-map .pf-system-active:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#ffb 0px 0px 8px 0px;box-shadow:#ffb 0px 0px 8px 0px}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#58100d 0px 0px 8px 0px;box-shadow:#58100d 0px 0px 8px 0px}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-head,.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-body{background-color:#58100d}.pf-map .pf-system-locked .pf-system-sec{cursor:default !important}.pf-map .pf-system-locked .pf-system-body{cursor:default !important}.pf-map .pf-system-locked .fa-lock{color:#63676a !important;display:inline-block !important}.pf-map .pf-map-endpoint-source,.pf-map .pf-map-endpoint-target{z-index:50}.pf-map .pf-map-endpoint-source svg,.pf-map .pf-map-endpoint-target svg{width:10;height:10}.pf-map .pf-map-endpoint-source svg circle,.pf-map .pf-map-endpoint-target svg circle{-webkit-transition:stroke 0.2s ease-out;transition:stroke 0.2s ease-out}.pf-map .pf-map-endpoint-source svg *,.pf-map .pf-map-endpoint-target svg *{stroke:#63676a;stroke-width:2;fill:#3c3f41;cursor:pointer}.pf-map .pf-map-endpoint-source svg *:hover,.pf-map .pf-map-endpoint-target svg *:hover{stroke:#eaeaea}.pf-map .pf-map-endpoint-source:hover circle,.pf-map .pf-map-endpoint-target:hover circle{stroke:#eaeaea !important}.pf-map svg._jsPlumb_connector{cursor:pointer;stroke-linecap:round}.pf-map svg._jsPlumb_connector path{-webkit-transition:stroke 0.2s ease-out;transition:stroke 0.2s ease-out}.pf-map svg._jsPlumb_connector path:not(:first-child){stroke:#3c3f41}.pf-map svg._jsPlumb_connector path:first-child{stroke:#63676a}.pf-map svg._jsPlumb_connector:hover path:first-child{stroke:#eaeaea}.pf-map svg.pf-map-connection-stargate path:first-child{stroke:#63676a}.pf-map svg.pf-map-connection-stargate path:not(:first-child){stroke:#63676a}.pf-map svg.pf-map-connection-stargate:hover path:first-child{stroke:#eaeaea}.pf-map svg.pf-map-connection-jumpbridge path:first-child{stroke:rgba(255,255,255,0)}.pf-map svg.pf-map-connection-jumpbridge path:not(:first-child){stroke:#568a89}.pf-map svg.pf-map-connection-jumpbridge:hover path:first-child{stroke:rgba(255,255,255,0)}.pf-map svg.pf-map-connection-jumpbridge:hover path:not(:first-child){stroke:#eaeaea}.pf-map svg.pf-map-connection-wh-eol path:first-child{stroke:#d747d6}.pf-map svg.pf-map-connection-wh-eol:hover path:first-child{stroke:#eaeaea}.pf-map svg.pf-map-connection-wh-reduced path:not(:first-child){stroke:#e28a0d}.pf-map svg.pf-map-connection-wh-critical path:not(:first-child){stroke:#a52521}.pf-map .pf-map-connection-overlay{padding:1px 4px;font-size:11px;z-index:1020;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.pf-map .frig{background-color:#f0ad4e;color:#1d1d1d}.pf-map .mass{background-color:#a52521;color:#eaeaea}.ui-dialog-content label{min-width:60px}.dropdown-menu{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:1020}.dropdown-menu i{width:20px}.pf-system-tooltip-inner{color:#adadad;padding:2px 4px;min-width:25px;-webkit-transition:color 0.2s ease-out;transition:color 0.2s ease-out}.pf-system-info-module .breadcrumb{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-system-info-module .breadcrumb li{text-transform:capitalize}.pf-system-info-module .pf-system-info-table{padding-right:7px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-system-info-module .popover table{color:#adadad;font-size:10px}.pf-system-info-module .popover table td{padding:0 5px}.pf-system-info-module .pf-system-info-graph-kills{width:100%;height:150px;padding:10px 0;position:relative}.pf-system-info-module .pf-system-route-table{font-size:10px}.pf-sig-table-module .pf-sig-table{font-size:10px}.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-name-input{text-transform:uppercase}.pf-sig-table-module .pf-sig-table th.pf-sig-table-counter{padding-right:20px !important}.pf-sig-table-module .pf-sig-table .pf-sig-table-counter{text-align:right}.pf-sig-table-module .pf-sig-table .pf-sig-table-counter .pf-digit-counter-small{width:20px;display:inline-block;font-size:10px}.pf-sig-table-module .pf-sig-table .pf-sig-table-counter .pf-digit-counter-large{width:26px;display:inline-block;font-size:10px}.pf-sig-table-module .pf-sig-table .popover-content table{border-spacing:0}.pf-sig-table-module .pf-sig-table .popover-content table tr{background-color:#3c3f41}.pf-sig-table-module .pf-sig-table .popover-content table tr:not(:last-child) td{border-bottom:1px solid #313335}.pf-sig-table-module .pf-sig-table .popover-content table tr td{padding:2px 5px}.pf-sig-table-module .pf-sig-table .popover-content table tr td:first-child{color:#63676a}.pf-sig-table-module .pf-sig-table .popover-content table tr td:last-child{color:#adadad}.pf-sig-table-module .pf-sig-table-tools{height:45px}.pf-sig-table-module .pf-sig-table-tools .btn:not(:last-child),.pf-sig-table-module .pf-sig-table-tools button.DTTT_button:not(:last-child),.pf-sig-table-module .pf-sig-table-tools div.DTTT_button:not(:last-child),.pf-sig-table-module .pf-sig-table-tools a.DTTT_button:not(:last-child){margin-right:10px}.pf-sig-table-module .pf-sig-table-tools-action{height:75px;display:none}input,select{background-color:#313335;color:#adadad;border:1px solid #63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}input:focus,select:focus{border-color:#568a89}.pf-icon{display:inline-block}.pf-icon-dotlan{background:url("../img/icons/dotlan_logo.png");width:17px;height:17px;opacity:0.8;margin:-5px 10px 0 10px}.modal-content .dataTable,.modal-content .table{font-size:10px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}#pf-manual-scrollspy{position:relative;height:500px;overflow:auto}.pf-dialog-dynamic-area{padding:10px;min-height:100px;position:relative;background-color:#313335;overflow:hidden;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-log-graph{height:100px;width:100%} + */.datepicker{padding:4px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker.datepicker-rtl{direction:rtl}.datepicker.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:6px}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:7px}.datepicker>div{display:none}.datepicker.days div.datepicker-days{display:block}.datepicker.months div.datepicker-months{display:block}.datepicker.years div.datepicker-years{display:block}.datepicker table{margin:0}.datepicker td,.datepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day:hover{background:#eeeeee;cursor:pointer}.datepicker table tr td.old,.datepicker table tr td.new{color:#999999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:none;color:#999999;cursor:default}.datepicker table tr td.today,.datepicker table tr td.today:hover,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-moz-linear-gradient(top, #fdd49a, #fdf59a);background-image:-ms-linear-gradient(top, #fdd49a, #fdf59a);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));background-image:-webkit-linear-gradient(top, #fdd49a, #fdf59a);background-image:-o-linear-gradient(top, #fdd49a, #fdf59a);background-image:linear-gradient(to bottom, #fdd49a,#fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#000}.datepicker table tr td.today:hover,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today[disabled],.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active{background-color:#fbf069 \9}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range:hover,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover{background:#eeeeee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover{background-color:#f3d17a;background-image:-moz-linear-gradient(top, #f3c17a, #f3e97a);background-image:-ms-linear-gradient(top, #f3c17a, #f3e97a);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));background-image:-webkit-linear-gradient(top, #f3c17a, #f3e97a);background-image:-o-linear-gradient(top, #f3c17a, #f3e97a);background-image:linear-gradient(to bottom, #f3c17a,#f3e97a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);border-color:#f3e97a #f3e97a #edde34;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled:hover[disabled]{background-color:#f3e97a}.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active{background-color:#efe24b \9}.datepicker table tr td.selected,.datepicker table tr td.selected:hover,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover{background-color:#9e9e9e;background-image:-moz-linear-gradient(top, #b3b3b3, gray);background-image:-ms-linear-gradient(top, #b3b3b3, gray);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(gray));background-image:-webkit-linear-gradient(top, #b3b3b3, gray);background-image:-o-linear-gradient(top, #b3b3b3, gray);background-image:linear-gradient(to bottom, #b3b3b3,#808080);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);border-color:#808080 #808080 #595959;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled:hover[disabled]{background-color:#808080}.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active{background-color:#666666 \9}.datepicker table tr td.active,.datepicker table tr td.active:hover,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top, #08c, #04c);background-image:-ms-linear-gradient(top, #08c, #04c);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));background-image:-webkit-linear-gradient(top, #08c, #04c);background-image:-o-linear-gradient(top, #08c, #04c);background-image:linear-gradient(to bottom, #0088cc,#0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.active:hover,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active[disabled],.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.datepicker table tr td span:hover{background:#eeeeee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:none;color:#999999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top, #08c, #04c);background-image:-ms-linear-gradient(top, #08c, #04c);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));background-image:-webkit-linear-gradient(top, #08c, #04c);background-image:-o-linear-gradient(top, #08c, #04c);background-image:linear-gradient(to bottom, #0088cc,#0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span.old,.datepicker table tr td span.new{color:#999999}.datepicker th.datepicker-switch{width:145px}.datepicker thead tr:first-child th,.datepicker tfoot tr th{cursor:pointer}.datepicker thead tr:first-child th:hover,.datepicker tfoot tr th:hover{background:#eeeeee}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datepicker thead tr:first-child th.cw{cursor:default;background-color:transparent}.input-append.date .add-on i,.input-prepend.date .add-on i{display:block;cursor:pointer;width:16px;height:16px}.input-daterange input{text-align:center}.input-daterange input:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-daterange input:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#eeeeee;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}.ui-pnotify{top:25px;right:25px;position:absolute;height:auto;z-index:9999}html>body>.ui-pnotify{position:fixed}.ui-pnotify .ui-pnotify-shadow{-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0px 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.ui-pnotify-container{background-position:0 0;padding:.8em;height:100%;margin:0}.ui-pnotify-sharp{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.ui-pnotify-title{display:block;margin-bottom:.4em;margin-top:0}.ui-pnotify-text{display:block;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.ui-pnotify-icon,.ui-pnotify-icon span{display:block;float:left;margin-right:.2em}.ui-pnotify.stack-topleft,.ui-pnotify.stack-bottomleft{left:25px;right:auto}.ui-pnotify.stack-bottomright,.ui-pnotify.stack-bottomleft{bottom:25px;top:auto}.ui-pnotify.stack-bar-top{right:0;top:0}.ui-pnotify.stack-bar-bottom{right:auto;bottom:0;top:auto;left:auto}html,body,#sb-site,.sb-site-container,.sb-slidebar{margin:0;padding:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{width:100%;overflow-x:hidden}html{height:100%}body{min-height:100%;height:auto;position:relative}html.sb-scroll-lock.sb-active:not(.sb-static){overflow:hidden}#sb-site,.sb-site-container{width:100%;position:relative;z-index:1;background:url("../img/pf-bg.jpg") #05050a;background-repeat:no-repeat}.sb-slidebar{height:100%;overflow-y:auto;position:fixed;top:0;z-index:0;display:none;background-color:#313335;-webkit-transform:translate(0px)}.sb-left{left:0;-webkit-box-shadow:inset -5px 0px 10px 0px rgba(0,0,0,0.4);box-shadow:inset -5px 0px 10px 0px rgba(0,0,0,0.4)}.sb-right{right:0;-webkit-box-shadow:inset 5px 0px 10px 0px rgba(0,0,0,0.4);box-shadow:inset 5px 0px 10px 0px rgba(0,0,0,0.4)}html.sb-static .sb-slidebar,.sb-slidebar.sb-static{position:absolute}.sb-slidebar.sb-active{display:block}.sb-style-overlay{z-index:9999}.sb-momentum-scrolling{-webkit-overflow-scrolling:touch}.sb-slidebar{width:30%}.sb-width-thin{width:15%}.sb-width-wide{width:45%}@media (max-width: 480px){.sb-slidebar{width:70%}.sb-width-thin{width:55%}.sb-width-wide{width:85%}}@media (min-width: 481px){.sb-slidebar{width:55%}.sb-width-thin{width:40%}.sb-width-wide{width:70%}}@media (min-width: 768px){.sb-slidebar{width:40%}.sb-width-thin{width:25%}.sb-width-wide{width:55%}}@media (min-width: 992px){.sb-slidebar{width:30%}.sb-width-thin{width:15%}.sb-width-wide{width:45%}}@media (min-width: 1200px){.sb-slidebar{width:20%}.sb-width-thin{width:5%}.sb-width-wide{width:35%}}.sb-slide,#sb-site,.sb-site-container,.sb-slidebar{-webkit-transition:-webkit-transform 400ms ease;-moz-transition:-moz-transform 400ms ease;-o-transition:-o-transform 400ms ease;transition:transform 400ms ease;-webkit-transition-property:-webkit-transform, left, right;-webkit-backface-visibility:hidden}.sb-hide{display:none}.pf-pie-chart{position:relative;display:table-cell;text-align:center;vertical-align:middle}.pf-pie-chart span{display:inline-block}.pf-pie-chart canvas{position:absolute;top:0;left:0}.pf-pie-chart-map-timer{width:36px;height:36px;margin:3px}.pf-pie-chart-map-timer canvas{top:3px;left:3px}.pf-pie-chart-map-timer span{font-size:10px}.pf-pie-chart-map-timer span:after{content:'s';margin-left:1px}div.pf-map-drag-to-select{background:#375959;display:none;opacity:0.3;z-index:9000;border:1px dashed #adadad;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}div.pf-map-drag-to-select.active{display:block}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;overflow:hidden;padding-left:8px;padding-right:20px;text-overflow:ellipsis}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{border:none;font-size:100%;margin-top:5px}.select2-dropdown{background-color:#313335;border:1px solid #63676a;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1500;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3)}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:10px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0;border-color:#568a89}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-container--default .select2-selection--single{background-color:#313335;border:1px solid #63676a;border-radius:0px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#adadad;line-height:28px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;color:#a52521}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#63676a}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#313335;border:1px solid #63676a;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#63676a;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#adadad;color:#2b2b2b;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#a52521;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0;-webkit-transition:border-color 0.3s ease-out;transition:border-color 0.3s ease-out;border-color:#568a89}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #63676a}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#375959;color:#eaeaea}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#adadad;color:#2b2b2b}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#313335;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #ffffff 50%,#eeeeee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff', endColorstr='#eee', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #adadad}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#63676a}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eeeeee 50%,#cccccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eee', endColorstr='#ccc', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #adadad}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #ffffff 0%,#eeeeee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff', endColorstr='#eee', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eeeeee 50%,#ffffff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eee', endColorstr='#fff', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #adadad}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#adadad;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #adadad}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#2b2b2b}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#adadad}html{margin:0;padding:0;height:100%;position:relative}body{margin:0;padding:0;min-height:100%;direction:ltr}body.mobile-view-activated.hidden-menu{overflow-x:hidden}body.modal-open{overflow:hidden !important}a:hover,a:active,a:focus,button,button:active,button:focus,object,embed,input::-moz-focus-inner{outline:0}h1,h3,h4{margin:0;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.page-title{margin:12px 0 28px}.page-title span{font-size:15px;color:#313335;display:inline-block;vertical-align:1px}label{font-weight:normal}*:focus{outline:0 !important}a,input,button{-ms-touch-action:none !important}textarea:focus,select:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{outline:0;outline:thin dotted \9;box-shadow:inset -1px 1px 5px 0 rgba(0,0,0,0.8) !important}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-group-sm>.input-group-btn>button.DTTT_button,.input-group-sm>.input-group-btn>div.DTTT_button,.input-group-sm>.input-group-btn>a.DTTT_button,.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-group-lg>.input-group-btn>button.DTTT_button,.input-group-lg>.input-group-btn>div.DTTT_button,.input-group-lg>.input-group-btn>a.DTTT_button,.input-xs,.form-control{border-radius:0px !important;-webkit-border-radius:0px !important;-moz-border-radius:0px !important}.input-xs{height:24px;padding:2px 10px;font-size:11px;line-height:1.5}.btn-xs,.btn-group-xs>.btn,.btn-group-xs>button.DTTT_button,.btn-group-xs>div.DTTT_button,.btn-group-xs>a.DTTT_button{padding:0px 2px;font-size:10px;line-height:1.3}.btn-sm,.btn-group-sm>.btn,.btn-group-sm>button.DTTT_button,.btn-group-sm>div.DTTT_button,.btn-group-sm>a.DTTT_button,button.DTTT_button,div.DTTT_button,a.DTTT_button{padding:6px 10px 5px}.btn-lg,.btn-group-lg>.btn,.btn-group-lg>button.DTTT_button,.btn-group-lg>div.DTTT_button,.btn-group-lg>a.DTTT_button{padding:10px 16px}.no-space{margin:0}.no-space>[class*="col-"]{margin:0 !important;padding-right:0;padding-left:0}h1{letter-spacing:-1px;font-size:22px;margin:10px 0}h1 small{font-size:12px;font-weight:300;letter-spacing:-1px}.lead{font-size:13px}h2{font-family:"Oxygen", "Open Sans", Arial, Helvetica, Sans-Serif;letter-spacing:0px;font-size:14px;margin:20px 0;line-height:normal}h3{display:block;font-size:17px;font-weight:400;margin:20px 0;line-height:normal}h4{line-height:normal;margin:20px 0 10px 0}h5{font-size:15px;font-weight:300;margin:10px 0;line-height:normal}h6{font-size:13px;margin:10px 0;font-weight:bold;line-height:normal}.row-seperator-header{margin:15px 14px 20px;border-bottom:none;display:block;color:#303133;font-size:20px;font-weight:400}.center-canvas,.center-child-canvas>canvas{display:block !important;margin:0 auto !important}.smart-accordion-default.panel-group{margin-bottom:0px}.smart-accordion-default.panel-group .panel+.panel{margin-top:-1px}.smart-accordion-default.panel-group .panel-heading{padding:0px}.smart-accordion-default.panel-group .panel-title a{display:block;padding:10px 15px;text-decoration:none !important}.smart-accordion-default .panel-heading,.panel-group .panel{border-radius:0px;-webkit-border-radius:0px;-moz-border-radius:0px}.smart-accordion-default .panel-default>.panel-heading{background-color:#f3f3f3}.smart-accordion-default .panel-default{border-color:#8d9194}.smart-accordion-default .panel-title>a>:first-child{display:none}.smart-accordion-default .panel-title>a.collapsed>.fa{display:none}.smart-accordion-default .panel-title>a.collapsed>:first-child{display:inline-block}.no-padding .smart-accordion-default>div{border-left:none !important;border-right:none !important}.no-padding .smart-accordion-default>div:first-child{border-top:none !important}.no-padding .smart-accordion-default>div:last-child{border-bottom:none !important}.onoffswitch-container{margin-top:4px;margin-left:7px;display:inline-block}.onoffswitch{position:relative;width:50px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;margin-top:3px;margin-bottom:3px;margin-left:5px;display:inline-block;vertical-align:middle}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:1px solid #484c4e;border-radius:50px;border-color:#777b7f #7c8184 #686c6f;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.onoffswitch-inner{width:200%;margin-left:-100%;display:block}.onoffswitch-inner:before,.onoffswitch-inner:after{float:left;width:50%;height:15px;padding:0;line-height:15px;font-size:10px;color:#fff;font-family:Trebuchet, Arial, sans-serif;font-weight:bold;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.onoffswitch-inner:before{content:attr(data-swchon-text);text-shadow:0 -1px 0 #313335;padding-left:7px;background-color:#3276b1;color:#fff;box-shadow:inset 0 2px 6px rgba(0,0,0,0.5),0 1px 2px rgba(0,0,0,0.05);text-align:left}.onoffswitch-inner:after{content:attr(data-swchoff-text);padding-right:7px;text-shadow:0 -1px 0 #fff;background-color:#fff;color:#3c3f41;text-align:right;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.onoffswitch-switch{width:19px;height:19px;margin:-2px;background:white;border:1px solid #64686b;border-radius:50px;position:absolute;top:0;bottom:0;right:32px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background-color:#eaeaea;background-image:-moz-linear-gradient(top, #fff, #adadad);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#adadad));background-image:-webkit-linear-gradient(top, #fff, #adadad);background-image:-o-linear-gradient(top, #fff, #adadad);background-image:linear-gradient(to bottom, #ffffff,#adadad);background-repeat:repeat-x;-webkit-box-shadow:1px 1px 4px 0px rgba(0,0,0,0.3);box-shadow:1px 1px 4px 0px rgba(0,0,0,0.3)}.onoffswitch-checkbox+.onoffswitch-label .onoffswitch-switch:before,.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch:before{content:"\f00d";color:#a52521;display:block;text-align:center;line-height:19px;font-size:10px;text-shadow:0 -1px 0 #fff;font-weight:bold;font-family:FontAwesome}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch:before{content:"\f00c";color:#428bca}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0;display:block}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0px}.onoffswitch-switch:hover{background-color:#adadad}.onoffswitch-switch:active{background-color:#adadad;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.onoffswitch-checkbox:disabled+.onoffswitch-label .onoffswitch-inner:after,.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-inner:before{text-shadow:0 1px 0 #fff;background:#bfbfbf;color:#313335}.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-switch,.onoffswitch-checkbox:disabled+.onoffswitch-label .onoffswitch-switch{background-color:#eaeaea;background-image:-moz-linear-gradient(top, #bfbfbf, #eaeaea);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#bfbfbf), to(#eaeaea));background-image:-webkit-linear-gradient(top, #bfbfbf, #eaeaea);background-image:-o-linear-gradient(top, #bfbfbf, #eaeaea);background-image:linear-gradient(to bottom, #bfbfbf,#eaeaea);box-shadow:none !important}.onoffswitch-checkbox:disabled+.onoffswitch-label,.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-label{border-color:#74797c #63676a #525558 !important}.onoffswitch-checkbox:checked+.onoffswitch-label{border-color:#3276b1 #2a6395 #255681}.onoffswitch+span,.onoffswitch-title{display:inline-block;vertical-align:middle;margin-top:-5px}.form-control{box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.form hr{margin-left:-13px;margin-right:-13px;border-color:rgba(0,0,0,0.1);margin-top:20px;margin-bottom:20px}.form fieldset{display:block;border:none;background:rgba(255,255,255,0.9);position:relative}fieldset{position:relative}.form-actions{display:block;padding:13px 14px 15px;border-top:1px solid rgba(0,0,0,0.1);background:rgba(239,239,239,0.9);margin-top:25px;margin-left:-13px;margin-right:-13px;margin-bottom:-13px;text-align:right}.well .form-actions{margin-left:-19px;margin-right:-19px;margin-bottom:-19px}.well.well-lg .form-actions{margin-left:-24px;margin-right:-24px;margin-bottom:-24px}.well.well-sm .form-actions{margin-left:-9px;margin-right:-9px;margin-bottom:-9px}.popover-content .form-actions{margin:0 -14px -9px;border-radius:0 0 3px 3px;padding:9px 14px}.no-padding .form .form-actions{margin:0;display:block;padding:13px 14px 15px;border-top:1px solid rgba(0,0,0,0.1);background:rgba(248,248,248,0.9);text-align:right;margin-top:25px}.form header,legend{display:block;padding:8px 0;border-bottom:1px dashed rgba(0,0,0,0.2);background:#fff;font-size:16px;font-weight:300;color:#2b2b2b;margin:25px 0px 20px}.no-padding .form header{margin:25px 14px 0}.form header:first-child{margin-top:10px}legend{font-weight:400;margin-top:0px;background:none}.input-group-addon{padding:6px 10px;border-radius:0;-moz-border-radius:0;-webkit-border-radius:0}.input-group-addon{transition:border-color 0.3s;-o-transition:border-color 0.3s;-ms-transition:border-color 0.3s;-moz-transition:border-color 0.3s;-webkit-transition:border-color 0.3s;transition:background-color 0.3s;-o-transition:background-color 0.3s;-ms-transition:background-color 0.3s;-moz-transition:background-color 0.3s;-webkit-transition:background-color 0.3s}.input-group-addon .fa{font-size:14px}.input-group-addon .fa-lg,.input-group-addon .fa-2x{font-size:2em}.input-group-addon .fa-3x,.input-group-addon .fa-4x,.input-group-addon .fa-5x{font-size:30px}input[type="text"]:focus+.input-group-addon{border-color:#0091d9;background-color:#666;color:#fff}.has-warning input[type="text"],.has-warning input[type="text"]+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]+.input-group-addon{background-color:#fdedd8;color:#2b2b2b}.has-warning input[type="text"]:focus,.has-warning input[type="text"]:focus+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]:focus+.input-group-addon{background-color:#f29717;color:#fff}.has-error .input-group-addon{border-color:#a52521;background:#f6d1d0;color:#2b2b2b}.has-error input[type="text"],.has-error input[type="text"]+.input-group-addon{border-color:#a52521}.has-error input[type="text"]+.input-group-addon{background-color:#f6d1d0;color:#2b2b2b}.has-error input[type="text"]:focus,.has-error input[type="text"]:focus+.input-group-addon{border-color:#d8403b}.has-error input[type="text"]:focus+.input-group-addon{background-color:#d8403b;color:#fff}.has-success input[type="text"]:focus+.input-group-addon{border-color:#4f9e4f;background-color:#4f9e4f;color:#fff}.form fieldset .form-group:last-child,.form fieldset .form-group:last-child .note,.form .form-group:last-child,.form .form-group:last-child .note{margin-bottom:0}.note{margin-top:6px;padding:0 1px;font-size:11px;line-height:15px;color:#63676a}.input-icon-right{position:relative}.input-icon-right>i,.input-icon-left>i{position:absolute;right:10px;top:30%;font-size:16px;color:#bfbfbf}.input-icon-left>i{right:auto;left:24px}.input-icon-right .form-control{padding-right:27px}.input-icon-left .form-control{padding-left:29px}input[type="text"].ui-autocomplete-loading,input[type="password"].ui-autocomplete-loading,input[type="datetime"].ui-autocomplete-loading,input[type="datetime-local"].ui-autocomplete-loading,input[type="date"].ui-autocomplete-loading,input[type="month"].ui-autocomplete-loading,input[type="time"].ui-autocomplete-loading,input[type="week"].ui-autocomplete-loading,input[type="number"].ui-autocomplete-loading,input[type="email"].ui-autocomplete-loading,input[type="url"].ui-autocomplete-loading,input[type="search"].ui-autocomplete-loading,input[type="tel"].ui-autocomplete-loading,input[type="color"].ui-autocomplete-loading{background-image:url("../img/select2-spinner.gif") !important;background-repeat:no-repeat;background-position:99% 50%;padding-right:27px}.input-group-addon .checkbox,.input-group-addon .radio{min-height:0px;margin-right:0px !important;padding-top:0}.input-group-addon label input[type="checkbox"].checkbox+span,.input-group-addon label input[type="radio"].radiobox+span,.input-group-addon label input[type="radio"].radiobox+span:before,.input-group-addon label input[type="checkbox"].checkbox+span:before{margin-right:0px}.input-group-addon .onoffswitch,.input-group-addon .onoffswitch-label{margin:0}.alert{margin-bottom:10px;margin-top:0px;padding:5px 15px 5px 34px;color:#675100;border-width:0px;border-left-width:3px;padding:10px}.alert .ui-pnotify-title{line-height:12px}.alert .ui-pnotify-text{font-size:10px}.alert .close{top:0px;right:-5px;line-height:20px}.alert-heading{font-weight:600}.alert-danger{border-color:#a52521;color:#2b2b2b;background:#f6d1d0;text-shadow:none}.alert-danger .ui-pnotify-icon{color:#a52521}.alert-warning{border-color:#e28a0d;color:#2b2b2b;background:#fef8f0}.alert-warning .ui-pnotify-icon{color:#e28a0d}.alert-success{border-color:#4f9e4f;color:#2b2b2b;background:#d1e8d1}.alert-success .ui-pnotify-icon{color:#4f9e4f}.alert-info{border-color:#316490;color:#2b2b2b;background:#abc9e2}.alert-info .ui-pnotify-icon{color:#316490}.progress-micro{height:3px !important;line-height:3px !important}.progress-xs{height:7px !important;line-height:7px !important}.progress-sm{height:14px !important;line-height:14px !important}.progress-lg{height:30px !important;line-height:30px !important}.progress .progress-bar{position:absolute;overflow:hidden;line-height:18px}.progress .progressbar-back-text{position:absolute;width:100%;height:100%;font-size:12px;line-height:20px;text-align:center}.progress .progressbar-front-text{display:block;width:100%;font-size:12px;line-height:20px;text-align:center}.progress.right .progress-bar{right:0}.progress.right .progressbar-front-text{position:absolute;right:0}.progress.vertical{width:25px;height:100%;min-height:150px;margin-right:20px;display:inline-block;margin-bottom:0px}.progress.wide-bar{width:40px}.progress.vertical.bottom{position:relative}.progress.vertical.bottom .progressbar-front-text{position:absolute;bottom:0}.progress.vertical .progress-bar{width:100%;height:0;-webkit-transition:height 0.6s ease;transition:height 0.6s ease}.progress.vertical.bottom .progress-bar{position:absolute;bottom:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{position:relative;margin-bottom:20px;overflow:hidden;height:18px;background:#adadad;box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;-webkit-box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;-moz-box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;border-radius:0px;-moz-border-radius:0px;-webkit-border-radius:0px}.progress-bar{float:left;width:0;height:100%;font-size:11px;color:#fff;text-align:center;background-color:#428bca;-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);font-weight:bold;text-shadow:0 -1px 0 rgba(0,0,0,0.25);-webkit-transition:width 1.5s ease-in-out;transition:width 1.5s ease-in-out}.progress-striped .progress-bar{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));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:-moz-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%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-danger{background-color:#a52521}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));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:-moz-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%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-success{background-color:#4f9e4f}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));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:-moz-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%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-warning{background-color:#e28a0d}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));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:-moz-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%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-info{background-color:#316490}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));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:-moz-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%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-info .bar,.progress .bar-info{background:#316490}.vertical-bars{padding:0;margin:0}.vertical-bars:after{content:"";display:block;height:0;clear:both}.vertical-bars li{padding:14px 0;width:25%;display:block;float:left;text-align:center}.vertical-bars li:first-child{border-left:none}.vertical-bars>li>.progress.vertical:first-child{margin-left:auto}.vertical-bars>li>.progress.vertical{margin:0 auto;float:none}.nav-tabs{border-bottom:none}.nav-tabs>li>a .badge{font-size:11px;padding:3px 5px 3px 5px;opacity:.5;margin-left:5px;min-width:17px;font-weight:normal}.tabs-left .nav-tabs>li>a .badge{margin-right:5px;margin-left:0px}.nav-tabs>li>a .label{display:inline-block;font-size:11px;margin-left:5px;opacity:.5}.nav-tabs>li>a{color:#adadad;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.nav-tabs>li>a:hover{color:#1d1d1d;border-color:transparent transparent #adadad transparent;margin-top:1px;border-top-width:0}.nav-tabs>li.active>a{background-color:#adadad;color:#2b2b2b;border-top-width:0px !important;margin-top:1px !important;font-weight:bold}.tabs-left .nav-tabs>li.active>a{-webkit-box-shadow:-2px 0 0 #428bca;-moz-box-shadow:-2px 0 0 #428bca;box-shadow:-2px 0 0 #428bca;border-top-width:1px !important;border-left:none !important;margin-left:1px !important}.tabs-left .nav-pills>li.active>a{border:none !important;box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.tabs-right .nav-tabs>li.active>a{-webkit-box-shadow:2px 0 0 #428bca;-moz-box-shadow:2px 0 0 #428bca;box-shadow:2px 0 0 #428bca;border-top-width:1px !important;border-right:none !important;margin-right:1px !important}.tabs-below .nav-tabs>li.active>a{-webkit-box-shadow:0 2px 0 #428bca;-moz-box-shadow:0 2px 0 #428bca;box-shadow:0 2px 0 #428bca;border-bottom-width:0px !important;border-top:none !important;margin-top:0px !important}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li,.tabs-left>.nav-pills>li,.tabs-right>.nav-pills>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a,.tabs-left>.nav-pills>li>a,.tabs-right>.nav-pills>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs,.tabs-left>.nav-pills{float:left;margin-right:19px;border-right:1px solid #9b9b9b}.tabs-left>.nav-pills{border-right:none}.tabs-left>.nav-tabs>li>a{margin-right:-1px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#adadad #949494 #adadad #adadad}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#949494 transparent #949494 #9b9b9b;*border-right-color:#fff}.tabs-left>.tab-content{margin-left:109px}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #9b9b9b}.tabs-right>.nav-tabs>li>a{margin-left:-1px}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#adadad #adadad #adadad #9b9b9b}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#9b9b9b #9b9b9b #9b9b9b transparent;*border-left-color:#fff}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#9b9b9b;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #9b9b9b #9b9b9b #9b9b9b}.nav-tabs.bordered{background:#fff;border:1px solid #9b9b9b}.nav-tabs.bordered>:first-child a{border-left-width:0px !important}.nav-tabs.bordered+.tab-content{border:1px solid #9b9b9b;border-top:none}.tabs-pull-right.nav-tabs>li,.tabs-pull-right.nav-pills>li{float:right}.tabs-pull-right.nav-tabs>li:first-child>a,.tabs-pull-right.nav-pills>li:first-child>a{margin-right:1px}.tabs-pull-right.bordered.nav-tabs>li:first-child>a,.tabs-pull-right.bordered.nav-pills>li:first-child>a{border-left-width:1px !important;margin-right:0px;border-right-width:0px}.dropdown-menu-xs{min-width:37px}.dropdown-menu-xs>li>a{padding:3px 10px}.dropdown-menu-xs>li>a:hover i{color:#fff !important}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#2b2b2b;margin-top:5px;margin-right:-10px}.dropdown-submenu:hover>a:after{border-left-color:#adadad}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px}.pagination>li>a,.pagination>li>span{box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-moz-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05)}.disabled{color:#fff}.btn-default.disabled,button.disabled.DTTT_button,div.disabled.DTTT_button,a.disabled.DTTT_button{color:#63676a}.btn,button.DTTT_button,div.DTTT_button,a.DTTT_button{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px;box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-moz-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05)}.btn:active,button.DTTT_button:active,div.DTTT_button:active,a.DTTT_button:active{position:relative;top:1px;left:1px}.btn.btn-ribbon,button.btn-ribbon.DTTT_button,div.btn-ribbon.DTTT_button,a.btn-ribbon.DTTT_button{background-color:#707070;background-image:-moz-linear-gradient(top, #777, #666);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#777), to(#666));background-image:-webkit-linear-gradient(top, #777, #666);background-image:-o-linear-gradient(top, #777, #666);background-image:linear-gradient(to bottom, #777777,#666666);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff777777', endColorstr='#ff666666', GradientType=0);color:white;padding:0 5px;line-height:20px;vertical-align:middle;height:20px;display:block;border:none;float:left;margin:0 8px 0 0;cursor:pointer}.btn.btn-ribbon>i,button.btn-ribbon.DTTT_button>i,div.btn-ribbon.DTTT_button>i,a.btn-ribbon.DTTT_button>i{font-size:111%}.ribbon-button-alignment{padding-top:10px;display:inline-block}.ribbon-button-alignment.pull-right>.btn.btn-ribbon,.ribbon-button-alignment.pull-right>button.btn-ribbon.DTTT_button,.ribbon-button-alignment.pull-right>div.btn-ribbon.DTTT_button,.ribbon-button-alignment.pull-right>a.btn-ribbon.DTTT_button{margin:0 0 0 8px}.panel-purple{border-color:#6e587a}.panel-purple>.panel-heading{color:#fff;background-color:#6e587a;border-color:#6e587a}.panel-greenLight{border-color:#71843f}.panel-greenLight>.panel-heading{color:#fff;background-color:#71843f;border-color:#71843f}.panel-greenDark{border-color:#496949}.panel-greenDark>.panel-heading{color:#fff;background-color:#496949;border-color:#496949}.panel-darken{border-color:#313335}.panel-darken>.panel-heading{color:#fff;background-color:#404040;border-color:#404040}.panel-pink{border-color:#e06fdf}.panel-pink>.panel-heading{color:#fff;background-color:#e06fdf;border-color:#e06fdf}.panel-green{border-color:#5cb85c}.panel-green>.panel-heading{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.panel-blueLight{border-color:#92a2a8}.panel-blueLight>.panel-heading{color:#fff;background-color:#92a2a8;border-color:#92a2a8}.panel-pinkDark{border-color:#a8829f}.panel-pinkDark>.panel-heading{color:#fff;background-color:#a8829f;border-color:#a8829f}.panel-redLight{border-color:#a65858}.panel-redLight>.panel-heading{color:#fff;background-color:#a65858;border-color:#a65858}.panel-red{border-color:#d9534f}.panel-red>.panel-heading{color:#fff;background-color:#d9534f;border-color:#d9534f}.panel-teal{border-color:#568a89}.panel-teal>.panel-heading{color:#fff;background-color:#568a89;border-color:#568a89}.panel-orange{border-color:#e28a0d}.panel-orange>.panel-heading{color:#fff;background-color:#e28a0d;border-color:#e28a0d}.panel-blueDark{border-color:#4c4f53}.panel-blueDark>.panel-heading{color:#fff;background-color:#4c4f53;border-color:#4c4f53}.panel-magenta{border-color:#6e3671}.panel-magenta>.panel-heading{color:#fff;background-color:#6e3671;border-color:#6e3671}.panel-blue{border-color:#428bca}.panel-blue>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-footer>.btn-block{border-radius:0px;-moz-border-radius:0px;-webkit-border-radius:0px;border-bottom:none;border-left:none;border-right:none}.btn-circle{width:30px;height:30px;text-align:center;padding:6px 0;font-size:12px;line-height:18px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-lg,.btn-group-lg>.btn-circle.btn,.btn-group-lg>button.btn-circle.DTTT_button,.btn-group-lg>div.btn-circle.DTTT_button,.btn-group-lg>a.btn-circle.DTTT_button{width:50px;height:50px;padding:10px 15px;font-size:18px;line-height:30px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 15px;font-size:24px;line-height:50px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-metro{margin:0 0 20px;padding-top:15px;padding-bottom:15px}.btn-metro>span{display:block;vertical-align:bottom;margin-top:10px;text-transform:uppercase}.btn-metro>span.label{position:absolute;top:0px;right:0px}.btn-label{position:relative;left:-12px;display:inline-block;padding:6px 12px;background:rgba(0,0,0,0.15);border-radius:3px 0 0 3px}.btn-labeled{padding-top:0;padding-bottom:0}.btn-link{box-shadow:none;-webkit-box-shadow:none;font-size:13px}.morris-hover.morris-default-style{border-radius:5px;padding:5px;color:#666;background:rgba(29,29,29,0.9);border:solid 2px #375959;font-family:'Oxygen Bold';font-size:10px;text-align:left;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap}.morris-hover{position:absolute;z-index:903}.fixed-page-footer .morris-hover{z-index:900}.txt-color.txt-color-blue{color:#428bca !important}.txt-color.txt-color-blueLight{color:#92a2a8 !important}.txt-color.txt-color-blueDark{color:#4c4f53 !important}.txt-color.txt-color-grayLightest{color:#eaeaea !important}.txt-color.txt-color-grayLight{color:#63676a !important}.txt-color.txt-color-gray{color:#3c3f41 !important}.txt-color.txt-color-grayDark{color:#313335 !important}.txt-color.txt-color-green,.txt-color.pf-log-info{color:#5cb85c !important}.txt-color.txt-color-greenLight{color:#71843f !important}.txt-color.txt-color-greenDark{color:#496949 !important}.txt-color.txt-color-red,.txt-color.pf-log-error{color:#d9534f !important}.txt-color.txt-color-yellow{color:#b09b5b !important}.txt-color.txt-color-orange{color:#e28a0d !important}.txt-color.txt-color-orangeDark{color:#c2760c !important}.txt-color.txt-color-pink{color:#e06fdf !important}.txt-color.txt-color-pinkDark{color:#a8829f !important}.txt-color.txt-color-purple{color:#6e587a !important}.txt-color.txt-color-darken{color:#404040 !important}.txt-color.txt-color-lighten{color:#d5e7ec !important}.txt-color.txt-color-white{color:#fff !important}.txt-color.txt-color-magenta{color:#6e3671 !important}.txt-color.txt-color-teal{color:#568a89 !important}.txt-color.txt-color-redLight{color:#a65858 !important}.txt-color.txt-color-primary{color:#375959 !important}.txt-color.txt-color-success{color:#4f9e4f !important}.txt-color.txt-color-information{color:#316490 !important}.txt-color.txt-color-warning,.txt-color.pf-log-warning{color:#e28a0d !important}.txt-color.txt-color-danger{color:#a52521 !important}.bg-color.bg-color-blue{background-color:#428bca !important}.bg-color.bg-color-blueLight{background-color:#92a2a8 !important}.bg-color.bg-color-blueDark{background-color:#4c4f53 !important}.bg-color.bg-color-green{background-color:#5cb85c !important}.bg-color.bg-color-greenLight{background-color:#71843f !important}.bg-color.bg-color-greenDark{background-color:#496949 !important}.bg-color.bg-color-red{background-color:#d9534f !important}.bg-color.bg-color-yellow{background-color:#b09b5b !important}.bg-color.bg-color-orange{background-color:#e28a0d !important}.bg-color.bg-color-orangeDark{background-color:#c2760c !important}.bg-color.bg-color-pink{background-color:#e06fdf !important}.bg-color.bg-color-pinkDark{background-color:#a8829f !important}.bg-color.bg-color-purple{background-color:#6e587a !important}.bg-color.bg-color-darken{background-color:#404040 !important}.bg-color.bg-color-lighten{background-color:#d5e7ec !important}.bg-color.bg-color-white{background-color:#fff !important}.bg-color.bg-color-grayDark{background-color:#525252 !important}.bg-color.bg-color-magenta{background-color:#6e3671 !important}.bg-color.bg-color-teal{background-color:#568a89 !important}.bg-color.bg-color-redLight{background-color:#a65858 !important}body{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}a{color:#477372}a:hover{color:#6caead}em{font-style:italic}em.pf-brand{text-transform:uppercase}.pf-loading-overlay{position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;background:#2b2b2b;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-loading-overlay .pf-loading-overlay-wrapper{width:25px;height:25px;margin:auto;text-align:center;position:absolute;top:0;left:0;bottom:0;right:0}.pf-loading-overlay .pf-loading-overlay-wrapper i{padding:3px}.sb-left .list-group-item{-webkit-box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4)}.sb-right .list-group-item{-webkit-box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4)}.pf-map-type-global{color:#568a89}.pf-map-type-alliance{color:#428bca}.pf-map-type-private{color:#5cb85c}#pf-map-module{margin:20px 10px 0 10px}#pf-map-module #pf-map-tabs .pf-map-type-tab-default{border-top:2px solid transparent}#pf-map-module #pf-map-tabs .pf-map-type-tab-global{border-top:2px solid #5cb85c}#pf-map-module #pf-map-tabs .pf-map-type-tab-alliance{border-top:2px solid #428bca}#pf-map-module #pf-map-tabs .pf-map-type-tab-private{border-top:2px solid #568a89}.pf-map-content-row{margin:10px 0 0 0;padding-bottom:40px}.pf-map-content-row .pf-module{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;background:rgba(60,63,65,0.3);padding:10px;width:100%;margin-bottom:10px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-system-effect{display:none;cursor:default;color:#adadad}.pf-system-effect-magnetar{color:#e06fdf;display:inline-block}.pf-system-effect-redgiant{color:#d9534f;display:inline-block}.pf-system-effect-pulsar{color:#428bca;display:inline-block}.pf-system-effect-wolfryet{color:#e28a0d;display:inline-block}.pf-system-effect-cataclysmic{color:#ffb;display:inline-block}.pf-system-effect-blackhole{color:#1d1d1d;display:inline-block}.pf-system-info-rally .pf-system-head{background-color:#782d77;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjEuMCIgeTE9IjEuMCIgeDI9IjAuMCIgeTI9IjAuMCI+PHN0b3Agb2Zmc2V0PSIyNSUiIHN0b3AtY29sb3I9IiMzZTI2NGUiLz48c3RvcCBvZmZzZXQ9IjI1JSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzNlMjY0ZSIvPjxzdG9wIG9mZnNldD0iNzUlIiBzdG9wLWNvbG9yPSIjM2UyNjRlIi8+PHN0b3Agb2Zmc2V0PSI3NSUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMC4wIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAuMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-moz-linear-gradient(135deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-webkit-linear-gradient(135deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:linear-gradient(-45deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:25px 25px;-webkit-animation:move 3s linear infinite;-moz-animation:move 3s linear infinite;-ms-animation:move 3s linear infinite;animation:move 3s linear infinite}.pf-system-security-0-0{color:#be0000}.pf-system-security-0-1{color:#ab2600}.pf-system-security-0-2{color:#be3900}.pf-system-security-0-3{color:#c24e02}.pf-system-security-0-4{color:#ab5f00}.pf-system-security-0-5{color:#bebe00}.pf-system-security-0-6{color:#73bf26}.pf-system-security-0-7{color:#00bf00}.pf-system-security-0-8{color:#00bf39}.pf-system-security-0-9{color:#39bf99}.pf-system-security-1-0{color:#28c0bf}.pf-system-sec{margin-right:5px;cursor:-moz-grab;cursor:-webkit-grab}.pf-system-sec-highSec{color:#5cb85c}.pf-system-sec-lowSec{color:#e28a0d}.pf-system-sec-nullSec{color:#d9534f}.pf-system-sec-high{color:#d9534f}.pf-system-sec-mid{color:#e28a0d}.pf-system-sec-low{color:#428bca}.pf-system-status-friendly{border-color:#428bca !important;color:#428bca}.pf-system-status-occupied{border-color:#e28a0d !important;color:#e28a0d}.pf-system-status-hostile{border-color:#d9534f !important;color:#d9534f}.pf-system-status-empty{border-color:#5cb85c !important;color:#5cb85c}.pf-system-status-unscanned{border-color:#568a89 !important;color:#568a89}.pf-system-effect-dialog-wrapper .table,.pf-jump-info-dialog .table{margin:15px 0}.pf-system-effect-dialog-wrapper .table td,.pf-jump-info-dialog .table td{text-transform:capitalize}.pf-fake-connection{box-sizing:content-box;display:inline-block;width:70px;height:4px;margin-right:5px;border-top:2px solid #63676a;border-bottom:2px solid #63676a;background-color:#3c3f41;position:relative;font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-fake-connection.pf-map-connection-stargate{background-color:#63676a;border-color:#63676a}.pf-fake-connection.pf-map-connection-jumpbridge{background-color:#6caead;border-color:#3c3f41;background:repeating-linear-gradient(to right, #6caead, #6caead 10px, #3c3f41 10px, #3c3f41 20px)}.pf-fake-connection.pf-map-connection-wh-eol{border-color:#d747d6}.pf-fake-connection.pf-map-connection-wh-reduced{background-color:#e28a0d}.pf-fake-connection.pf-map-connection-wh-critical{background-color:#a52521}.pf-fake-connection.pf-map-connection-frig{border-style:dashed;border-left:none;border-right:none}.pf-fake-connection.pf-map-connection-frig:after{content:'frig';background-color:#e28a0d;color:#1d1d1d;padding:0px 3px;position:absolute;left:25px;top:-6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.pf-fake-connection.pf-map-connection-preserve-mass:after{content:'save mass';background-color:#a52521;color:#eaeaea;padding:0px 3px;position:absolute;left:9px;top:-6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.tooltip-inner{color:#5cb85c;background-color:#3c3f41;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;padding:5px 5px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.tooltip.top .tooltip-arrow{border-top-color:#63676a}.tooltip.right .tooltip-arrow{border-right-color:#63676a}.tooltip.bottom .tooltip-arrow{border-bottom-color:#63676a}.tooltip.left .tooltip-arrow{border-left-color:#63676a}#pf-head{margin-bottom:0px}#pf-head a:focus{color:#477372}#pf-head a:hover{text-decoration:none}#pf-head a:hover .badge{color:#6caead}#pf-head i{margin-right:2px}#pf-head .pf-head-menu .pf-head-menu-logo{width:18px;height:18px;display:inline-block;float:left;background:url('data:image/png;base64,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')}#pf-head .pf-head-menu:hover .pf-head-menu-logo{background:url('data:image/png;base64,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')}#pf-head .pf-head-menu:focus .pf-head-menu-logo{background:url('data:image/png;base64,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')}#pf-head .badge{background-color:#3c3f41;color:#adadad}#pf-head .pf-head-active-user,#pf-head .pf-head-current-location{display:none}#pf-head .pf-head-active-user .badge,#pf-head .pf-head-current-location .badge{-webkit-transition:color 0.3s ease-out;transition:color 0.3s ease-out}#pf-head .pf-head-program-status{cursor:pointer}#pf-footer{position:absolute;bottom:0;left:0;width:100%;margin:0;background:rgba(60,63,65,0.3)}#pf-footer a{font-family:"Oxygen" Georgia,"Times New Roman",Times,serif;color:#375959}#pf-footer a:hover{color:#477372;text-decoration:none}@-webkit-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-moz-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-ms-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-webkit-keyframes bounce{0%, 20%, 50%, 80%, 100%{-webkit-transform:translateY(0)}40%{-webkit-transform:translateY(-8px)}60%{-webkit-transform:translateY(-4px)}}@keyframes bounce{0%, 20%, 50%, 80%, 100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}.pf-map-tab-content .pf-map-wrapper{position:relative;width:100%;max-width:2515px;height:550px;overflow:auto;padding:5px;background:rgba(43,43,43,0.93);box-shadow:inset -3px 3px 10px 0 rgba(0,0,0,0.3);border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-width:1px;border-style:solid;border-color:#adadad}.pf-map-overlay{position:absolute;display:none;z-index:10000;width:36px;height:36px;bottom:23px;right:10px;background:rgba(0,0,0,0.2);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-grid-small{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAG1JREFUeNrs18EJgDAQRNGJpoQQSC+CWMSWEwhYrCAWYRNz2MP/BQzvOiUi5Op5vzl6u+VrbUoeQIAAAQIECBAgQICpK8d5zay40dtenR+CTwIQIECAAAECBAgQYLaqpGX8EHLuSdIPAAD//wMAuMQN2uF+ypQAAAAASUVORK5CYII=') !important}.pf-map{width:2500px;height:520px;position:relative;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-map ._jsPlumb_overlay{opacity:1;pointer-events:none}.pf-map ._jsPlumb_hover._jsPlumb_overlay{opacity:0}.pf-map ._jsPlumb_hover:not(._jsPlumb_overlay){-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:0.5s;animation-delay:0.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:linear;animation-timing-function:linear;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-webkit-animation-name:bounce;animation-name:bounce}.pf-map ._jsPlumb_target_hover,.pf-map ._jsPlumb_source_hover{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:0.5s;animation-delay:0.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:linear;animation-timing-function:linear;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-webkit-animation-name:bounce;animation-name:bounce;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3)}.pf-map .pf-system{position:absolute;min-width:60px;height:auto;background-color:#313335;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:100;will-change:all, transform;border-width:2px;border-style:solid;border-color:#63676a;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-webkit-transition:border-color 0.5s ease-out,box-shadow 0.2s ease-out;transition:border-color 0.5s ease-out,box-shadow 0.2s ease-out;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.pf-map .pf-system:hover{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3);-moz-transform:translate3d(0, -2px, 0);-ms-transform:translate3d(0, -2px, 0);-webkit-transform:translate3d(0, -2px, 0);transform:translate3d(0, -2px, 0)}.pf-map .pf-system .pf-system-head{padding:0px 3px 0px 3px;cursor:pointer;font-family:Arial;font-weight:bold}.pf-map .pf-system .pf-system-head .pf-system-head-name{border:none;display:inline-block;min-width:41px;color:#adadad;margin-right:2px}.pf-map .pf-system .pf-system-head .fa-lock{display:none}.pf-map .pf-system .pf-system-head .pf-system-head-expand{margin-left:2px;color:#63676a;display:none}.pf-map .pf-system .pf-system-body{height:0px;width:100%;overflow:hidden;cursor:-moz-grab;cursor:-webkit-grab;cursor:grab;padding:0 2px;white-space:nowrap;display:none;border-top-width:1px;border-top-style:dashed;border-top-color:#63676a}.pf-map .pf-system .pf-system-body .pf-system-body-item{color:#63676a;font-size:10px}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-system-body-right{text-overflow:ellipsis;float:right;color:#568a89;display:none}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-user-status{font-size:7px}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-user-status-corp{color:#5cb85c}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-user-status-ally{color:#428bca}.pf-map .pf-system .tooltip.in{opacity:1}.pf-map .pf-system .tooltip .tooltip-inner{color:#313335;background-color:#adadad;padding:3px 3px}.pf-map .pf-system-active:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#ffb 0px 0px 8px 0px;box-shadow:#ffb 0px 0px 8px 0px}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#58100d 0px 0px 8px 0px;box-shadow:#58100d 0px 0px 8px 0px}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-head,.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-body{background-color:#58100d}.pf-map .pf-system-locked .pf-system-sec{cursor:default !important}.pf-map .pf-system-locked .pf-system-body{cursor:default !important}.pf-map .pf-system-locked .fa-lock{color:#63676a !important;display:inline-block !important}.pf-map .pf-map-endpoint-source,.pf-map .pf-map-endpoint-target{z-index:50}.pf-map .pf-map-endpoint-source svg,.pf-map .pf-map-endpoint-target svg{width:10;height:10}.pf-map .pf-map-endpoint-source svg circle,.pf-map .pf-map-endpoint-target svg circle{-webkit-transition:stroke 0.2s ease-out;transition:stroke 0.2s ease-out}.pf-map .pf-map-endpoint-source svg *,.pf-map .pf-map-endpoint-target svg *{stroke:#63676a;stroke-width:2;fill:#3c3f41;cursor:pointer}.pf-map .pf-map-endpoint-source svg *:hover,.pf-map .pf-map-endpoint-target svg *:hover{stroke:#eaeaea}.pf-map .pf-map-endpoint-source:hover circle,.pf-map .pf-map-endpoint-target:hover circle{stroke:#eaeaea !important}.pf-map svg._jsPlumb_connector{cursor:pointer;stroke-linecap:round}.pf-map svg._jsPlumb_connector path{-webkit-transition:stroke 0.2s ease-out;transition:stroke 0.2s ease-out}.pf-map svg._jsPlumb_connector path:not(:first-child){stroke:#3c3f41}.pf-map svg._jsPlumb_connector path:first-child{stroke:#63676a}.pf-map svg._jsPlumb_connector:hover path:first-child{stroke:#eaeaea}.pf-map svg.pf-map-connection-stargate path:first-child{stroke:#63676a}.pf-map svg.pf-map-connection-stargate path:not(:first-child){stroke:#63676a}.pf-map svg.pf-map-connection-stargate:hover path:first-child{stroke:#eaeaea}.pf-map svg.pf-map-connection-jumpbridge path:first-child{stroke:rgba(255,255,255,0)}.pf-map svg.pf-map-connection-jumpbridge path:not(:first-child){stroke:#568a89}.pf-map svg.pf-map-connection-jumpbridge:hover path:first-child{stroke:rgba(255,255,255,0)}.pf-map svg.pf-map-connection-jumpbridge:hover path:not(:first-child){stroke:#eaeaea}.pf-map svg.pf-map-connection-wh-eol path:first-child{stroke:#d747d6}.pf-map svg.pf-map-connection-wh-eol:hover path:first-child{stroke:#eaeaea}.pf-map svg.pf-map-connection-wh-reduced path:not(:first-child){stroke:#e28a0d}.pf-map svg.pf-map-connection-wh-critical path:not(:first-child){stroke:#a52521}.pf-map .pf-map-connection-overlay{padding:1px 4px;font-size:11px;z-index:1020;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.pf-map .frig{background-color:#f0ad4e;color:#1d1d1d}.pf-map .mass{background-color:#a52521;color:#eaeaea}.ui-dialog-content label{min-width:60px}.dropdown-menu{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:1020}.dropdown-menu i{width:20px}.pf-system-tooltip-inner{color:#adadad;padding:2px 4px;min-width:25px;-webkit-transition:color 0.2s ease-out;transition:color 0.2s ease-out}.pf-system-info-module .breadcrumb{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-system-info-module .breadcrumb li{text-transform:capitalize}.pf-system-info-module .pf-system-info-table{padding-right:7px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-system-info-module .popover table{color:#adadad;font-size:10px}.pf-system-info-module .popover table td{padding:0 5px}.pf-system-info-module .pf-system-info-graph-kills{width:100%;height:150px;padding:10px 0;position:relative}.pf-system-info-module .pf-system-route-table{font-size:10px}.pf-sig-table-module .pf-sig-table{font-size:10px}.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-name-input{text-transform:uppercase}.pf-sig-table-module .pf-sig-table th.pf-sig-table-counter{padding-right:20px !important}.pf-sig-table-module .pf-sig-table .pf-sig-table-counter{text-align:right}.pf-sig-table-module .pf-sig-table .pf-sig-table-counter .pf-digit-counter-small{width:20px;display:inline-block;font-size:10px}.pf-sig-table-module .pf-sig-table .pf-sig-table-counter .pf-digit-counter-large{width:26px;display:inline-block;font-size:10px}.pf-sig-table-module .pf-sig-table .popover-content table{border-spacing:0}.pf-sig-table-module .pf-sig-table .popover-content table tr{background-color:#3c3f41}.pf-sig-table-module .pf-sig-table .popover-content table tr:not(:last-child) td{border-bottom:1px solid #313335}.pf-sig-table-module .pf-sig-table .popover-content table tr td{padding:2px 5px}.pf-sig-table-module .pf-sig-table .popover-content table tr td:first-child{color:#63676a}.pf-sig-table-module .pf-sig-table .popover-content table tr td:last-child{color:#adadad}.pf-sig-table-module .pf-sig-table-tools{height:45px}.pf-sig-table-module .pf-sig-table-tools .btn:not(:last-child),.pf-sig-table-module .pf-sig-table-tools button.DTTT_button:not(:last-child),.pf-sig-table-module .pf-sig-table-tools div.DTTT_button:not(:last-child),.pf-sig-table-module .pf-sig-table-tools a.DTTT_button:not(:last-child){margin-right:10px}.pf-sig-table-module .pf-sig-table-tools-action{height:75px;display:none}input,select{background-color:#313335;color:#adadad;border:1px solid #63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}input:focus,select:focus{border-color:#568a89}.pf-icon{display:inline-block}.pf-icon-dotlan{background:url("../img/icons/dotlan_logo.png");width:17px;height:17px;opacity:0.8;margin:-5px 10px 0 10px}.modal-content .dataTable,.modal-content .table{font-size:10px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}#pf-manual-scrollspy{position:relative;height:500px;overflow:auto}.pf-system-dialog-select{width:270px !important}.pf-dialog-dynamic-area{padding:10px;min-height:100px;position:relative;background-color:#313335;overflow:hidden;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-log-graph{height:100px;width:100%} diff --git a/public/templates/modules/map_dialog.html b/public/templates/modules/map_dialog.html index 9eaa97bb..638c6a65 100644 --- a/public/templates/modules/map_dialog.html +++ b/public/templates/modules/map_dialog.html @@ -19,7 +19,7 @@
    @@ -27,7 +27,7 @@
    diff --git a/public/templates/modules/system_dialog.html b/public/templates/modules/system_dialog.html index e6252089..d920fab0 100644 --- a/public/templates/modules/system_dialog.html +++ b/public/templates/modules/system_dialog.html @@ -1,21 +1,57 @@
    -
    -
    - -
    -
    - + Search system name +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    + +
    + +
    +
    - Enter system name
    -
    - -
    - + + +
    +
    +
    + +
    + +
    +
    +
    \ No newline at end of file diff --git a/sass/bootstrap/_forms.scss b/sass/bootstrap/_forms.scss index 26282385..3bdeb10c 100644 --- a/sass/bootstrap/_forms.scss +++ b/sass/bootstrap/_forms.scss @@ -291,7 +291,7 @@ input[type="checkbox"], @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg); } .has-error { - @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg); + @include form-control-validation($red, $red, $state-danger-bg); } @@ -314,7 +314,7 @@ input[type="checkbox"], display: block; // account for any element using help-block margin-top: 5px; margin-bottom: 10px; - color: lighten($text-color, 25%); // lighten the text some for contrast + color: lighten($text-color, 10%); // lighten the text some for contrast } diff --git a/sass/bootstrap/_mixins.scss b/sass/bootstrap/_mixins.scss index e451865d..621191c2 100644 --- a/sass/bootstrap/_mixins.scss +++ b/sass/bootstrap/_mixins.scss @@ -880,11 +880,19 @@ border-color: $border-color; @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work &:focus { - border-color: darken($border-color, 10%); + // border-color: darken($border-color, 5%); $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%); @include box-shadow($shadow); } } + + // select2 style + .select2-selection{ + border: 1px solid !important; + border-color: $border-color !important; + @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work + } + // Set validation states also for addons .input-group-addon { color: $text-color; diff --git a/sass/layout/_dialogs.scss b/sass/layout/_dialogs.scss index bd5dbe58..3f36958d 100644 --- a/sass/layout/_dialogs.scss +++ b/sass/layout/_dialogs.scss @@ -2,7 +2,7 @@ .modal-content { - // data tables =================================================== + // data tables ========================================== .dataTable, .table{ font-size: 10px; font-family: $font-family-bold; @@ -16,6 +16,12 @@ overflow: auto; } +// ad system dialog ======================================= +.pf-system-dialog-select{ + width: 270px !important; +} + + // map info dialog ======================================== .pf-dialog-dynamic-area{ padding: 10px; diff --git a/sass/layout/_map.scss b/sass/layout/_map.scss index 48e90cd4..cc5fe179 100644 --- a/sass/layout/_map.scss +++ b/sass/layout/_map.scss @@ -118,6 +118,8 @@ $mapWidth: 2500px; background-color: $gray-dark; font-family: $font-family-bold; z-index: 100; + will-change: all, transform; + //opacity: 0; // trigger by js border: { width: 2px; diff --git a/sass/library/x-editable/_bootstrap-editable.scss b/sass/library/x-editable/_bootstrap-editable.scss index 483afeb9..c663ed98 100644 --- a/sass/library/x-editable/_bootstrap-editable.scss +++ b/sass/library/x-editable/_bootstrap-editable.scss @@ -6,6 +6,11 @@ margin-bottom: 0; /* overwrites bootstrap margin */ } +// quick fix +.editableform .form-group{ + margin-left: 0 !important; +} + .editableform .control-group { margin-bottom: 0; /* overwrites bootstrap margin */ white-space: nowrap; /* prevent wrapping buttons on new line */ diff --git a/sass/smartadmin/_main.scss b/sass/smartadmin/_main.scss index ce2646ad..aba49648 100644 --- a/sass/smartadmin/_main.scss +++ b/sass/smartadmin/_main.scss @@ -79,7 +79,7 @@ input[type="color"]:focus, //-webkit-box-shadow: none !important; //-moz-box-shadow: none !important; //box-shadow: none !important; - box-shadow: inset -1px 1px 6px 0 rgba(0, 0, 0, 0.8) !important; + box-shadow: inset -1px 1px 5px 0 rgba(0, 0, 0, 0.8) !important; } .input-sm,