Browse Source

more work done on flow, loading page, ajax get, page title, wip legal pages

Rafał Pitoń 9 years ago
parent
commit
0ef474c78b
34 changed files with 1316 additions and 3570 deletions
  1. 3 2
      misago/frontend/gulpfile.js
  2. 5 5
      misago/frontend/misago/app.js
  3. 42 0
      misago/frontend/misago/components/footer/footer-nav.js
  4. 21 0
      misago/frontend/misago/components/footer/forum-footer.js
  5. 11 0
      misago/frontend/misago/components/footer/misago-branding.js
  6. 7 1
      misago/frontend/misago/components/forum-layout.js
  7. 18 0
      misago/frontend/misago/components/index.js
  8. 73 0
      misago/frontend/misago/components/legal.js
  9. 22 0
      misago/frontend/misago/components/loaders.js
  10. 13 0
      misago/frontend/misago/components/misago-markup.js
  11. 20 0
      misago/frontend/misago/components/navbar/brand-full.js
  12. 6 9
      misago/frontend/misago/components/navbar/forum-navbar.js
  13. 13 0
      misago/frontend/misago/components/page-header.js
  14. 0 0
      misago/frontend/misago/models/factory.js
  15. 77 0
      misago/frontend/misago/services/api.js
  16. 4 4
      misago/frontend/misago/services/outlet.js
  17. 105 11
      misago/frontend/misago/services/router.js
  18. 31 0
      misago/frontend/misago/services/title.js
  19. 2 0
      misago/frontend/misago/style/misago.less
  20. 102 0
      misago/frontend/misago/style/misago/loaders.less
  21. 12 0
      misago/frontend/misago/style/misago/variables.less
  22. 12 0
      misago/frontend/misago/urls.js
  23. 11 0
      misago/frontend/misago/utils/strings.js
  24. 2 2
      misago/frontend/misago/utils/urlconf.js
  25. 7 0
      misago/frontend/misago/utils/views-shortcuts.js
  26. 7 0
      misago/frontend/package.json
  27. 1 1
      misago/frontend/test/index.html
  28. 2 2
      misago/frontend/test/tests/unit/service-container.js
  29. 23 0
      misago/frontend/test/tests/unit/string-utils.js
  30. 87 0
      misago/frontend/test/utils/django-js-catalog.js
  31. 1 3495
      misago/static/misago/css/misago.css
  32. 571 35
      misago/static/misago/js/misago.js
  33. 1 1
      misago/static/misago/js/misago.js.map
  34. 4 2
      misago/templates/misago/base.html

+ 3 - 2
misago/frontend/gulpfile.js

@@ -38,11 +38,12 @@ gulp.task('lint', function() {
 gulp.task('misagojs', ['lint'], function() {
   return gulp.src([
       'misago/app.js',
-      'misago/components/**/*.js',
       'misago/models/*.js',
+      'misago/components/**/*.js',
       'misago/services/*.js',
       'misago/templates/**/*.js',
       'misago/utils/**/*.js',
+      'misago/urls.js',
     ])
     .pipe(concat('misago.js'))
     .pipe(gulp.dest('dist'));
@@ -206,6 +207,6 @@ gulp.task('test', ['starttestserver'], function() {
   gulp.watch([
     'test/tests/**/*.js', 'misago/**/*.js', 'misago/**/*.less'
   ], [
-    'collecttests', 'collecttestjs', 'collecttestcss'
+    'collecttests', 'collecttestjs', 'collecttestcss', 'collecttestsutils'
   ]);
 });

+ 5 - 5
misago/frontend/misago/app.js

@@ -55,7 +55,10 @@
     this.registerCoreServices = function() {
       this.addService('conf', ns.Conf);
       this.addService('router', ns.RouterFactory);
+      this.addService('api', ns.Api);
       this.addService('outlet', ns.Outlet);
+      this.addService('title', ns.PageTitle);
+      this.addService('start-routing', ns.startRouting);
     };
 
     // Component factory
@@ -65,10 +68,7 @@
         arguments_array.push(arguments[i]);
       }
 
-      if (arguments_array[arguments_array.length - 1] !== this) {
-        arguments_array.push(this);
-      }
-
+      arguments_array.push(this);
       return m.component.apply(undefined, arguments_array);
     };
 
@@ -76,7 +76,7 @@
     this.setup = false;
     this.init = function(setup) {
       this.setup = {
-        outlet: ns.get(setup, 'outlet', null),
+        fixture: ns.get(setup, 'fixture', null),
         in_test: ns.get(setup, 'in_test', false)
       };
 

+ 42 - 0
misago/frontend/misago/components/footer/footer-nav.js

@@ -0,0 +1,42 @@
+(function (ns) {
+  'use strict';
+
+  var legalLink = function(_, legal_type, default_title) {
+    var url = ns.get(_.settings, legal_type + '_link');
+    if (!url && ns.get(_.settings, legal_type)) {
+      url = _.router.url(legal_type);
+    }
+
+    if (url) {
+      return m('li',
+        m('a', {href: url}, ns.get(_.settings, legal_type + '_title', default_title))
+      );
+    } else {
+      return null;
+    }
+  };
+
+  ns.FooterNav = {
+    isVisible: function(settings) {
+      return [
+        !!settings.forum_footnote,
+        !!settings.terms_of_service,
+        !!settings.terms_of_service_link,
+        !!settings.privacy_policy,
+        !!settings.privacy_policy_link
+      ].indexOf(true) !== -1;
+    },
+    view: function(ctrl, _) {
+      var items = [];
+
+      if (_.settings.forum_footnote) {
+        items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));
+      }
+
+      items.push(legalLink(_, 'terms_of_service', gettext('Terms of service')));
+      items.push(legalLink(_, 'privacy_policy', gettext('Privacy policy')));
+
+      return m('ul.list-inline.footer-nav', items);
+    }
+  };
+}(Misago.prototype));

+ 21 - 0
misago/frontend/misago/components/footer/forum-footer.js

@@ -0,0 +1,21 @@
+(function (ns) {
+  'use strict';
+
+  ns.ForumFooter = {
+    view: function(ctrl, _) {
+      var nav = null;
+      if (ns.FooterNav.isVisible(_.settings)) {
+        nav = _.component(ns.FooterNav);
+      }
+
+      return m('footer.forum-footer', [
+        m('.container',
+          m('.footer-content', [
+            nav,
+            _.component(ns.FooterMisagoBranding)
+          ])
+        )
+      ]);
+    }
+  };
+}(Misago.prototype));

+ 11 - 0
misago/frontend/misago/components/footer/misago-branding.js

@@ -0,0 +1,11 @@
+(function (ns) {
+  'use strict';
+
+  ns.FooterMisagoBranding = {
+    view: function() {
+      return m('a.misago-branding[href=http://misago-project.org]', [
+        "powered by ", m('strong', "misago")
+      ]);
+    }
+  };
+}(Misago.prototype));

+ 7 - 1
misago/frontend/misago/components/forum-layout.js

@@ -1,10 +1,16 @@
 (function (ns) {
   'use strict';
 
+  var persistent = function(el, isInit, context) {
+    context.retain = true;
+  };
+
   ns.ForumLayout = {
     view: function(ctrl, _) {
       return [
-        _.component(ns.ForumNavbar)
+        _.component(ns.ForumNavbar),
+        m('#router-fixture', {config: persistent}),
+        _.component(ns.ForumFooter)
       ];
     }
   };

+ 18 - 0
misago/frontend/misago/components/index.js

@@ -0,0 +1,18 @@
+(function (ns) {
+  'use strict';
+
+  var self = {
+    controller: function() {
+      var _ = self.container;
+      _.setTitle(_.settings.forum_index_title);
+    },
+    view: function() {
+      return m('.container', [
+        m('h1', 'Forum index page!'),
+        m('p', 'Lorem ipsum dolor met sit amet elit.'),
+        m('p', 'Sequar elit dolor nihi putto.')
+      ]);
+    }
+  };
+  ns.IndexPage = self;
+}(Misago.prototype));

+ 73 - 0
misago/frontend/misago/components/legal.js

@@ -0,0 +1,73 @@
+(function (ns) {
+  'use strict';
+
+  var legalPageFactory = function(type_name, default_title) {
+    var dashed_type_name = type_name.replace(/_/g, '-');
+
+    var self = {
+      is_destroyed: true,
+      controller: function() {
+        self.is_destroyed = false;
+        self.vm.init();
+
+        return {
+          onunload: function() {
+            self.is_destroyed = true;
+          }
+        };
+      },
+      vm: {
+        is_busy: false,
+        is_ready: false,
+        content: null,
+
+        init: function() {
+          var _ = self.container;
+
+          var vm = this;
+          if (vm.is_ready) {
+            _.setTitle(vm.title);
+          } else {
+            _.setTitle();
+
+            if (!vm.is_busy) {
+              vm.is_busy = true;
+
+              _.api.one('legal-pages', dashed_type_name).then(function(data) {
+                vm.title = data.title || default_title;
+                vm.body = data.body;
+                vm.is_busy = false;
+                vm.is_ready = true;
+
+                if (!self.is_destroyed) {
+                  _.setTitle(vm.title);
+                  m.redraw();
+                }
+              });
+            }
+          }
+        }
+      },
+      view: function() {
+        var _ = this.container;
+
+        if (this.vm.is_ready) {
+          return m('.page.page-legal.page-legal-' + dashed_type_name, [
+            _.component(ns.PageHeader, {title: this.vm.title}),
+            m('.container',
+              m.trust(this.vm.body)
+            )
+          ]);
+        } else {
+          return _.component(ns.LoadingPage);
+        }
+      }
+    };
+    return self;
+  };
+
+  ns.TermsOfServicePage = legalPageFactory(
+    'terms_of_service', gettext('Terms of service'));
+  ns.PrivacyPolicyPage = legalPageFactory(
+    'privacy_policy', gettext('Privacy policy'));
+}(Misago.prototype));

+ 22 - 0
misago/frontend/misago/components/loaders.js

@@ -0,0 +1,22 @@
+(function (ns) {
+  'use strict';
+
+  ns.Loader = {
+    view: function() {
+      return m('.loader.sk-folding-cube', [
+        m('.sk-cube1.sk-cube'),
+        m('.sk-cube2.sk-cube'),
+        m('.sk-cube4.sk-cube'),
+        m('.sk-cube3.sk-cube')
+      ]);
+    }
+  };
+
+  ns.LoadingPage = {
+    view: function(ctrl, _) {
+      return m('.page.page-loading',
+        _.component(ns.Loader)
+      );
+    }
+  };
+} (Misago.prototype));

+ 13 - 0
misago/frontend/misago/components/misago-markup.js

@@ -0,0 +1,13 @@
+(function (ns) {
+  'use strict';
+
+  var setupMarkup = function(el, isInit, context) {
+    context.retain = true;
+  };
+
+  ns.MisagoMarkup = {
+    view: function(ctrl, content) {
+      return m('article.misago-markup', {config: setupMarkup}, m.trust(content));
+    }
+  };
+}(Misago.prototype));

+ 20 - 0
misago/frontend/misago/components/navbar/brand-full.js

@@ -0,0 +1,20 @@
+(function (ns) {
+  'use strict';
+
+  ns.BrandFull = {
+    view: function(ctrl, branding, _) {
+      var children = [
+        m('img', {
+          src: _.router.staticUrl('misago/img/site-logo.png'),
+          alt: _.settings.forum_name
+        })
+      ];
+
+      if (branding) {
+        children.push(branding);
+      }
+
+      return m('a.navbar-brand', {href: _.router.url('index')}, children);
+    }
+  };
+}(Misago.prototype));

+ 6 - 9
misago/frontend/misago/components/navbar/forum-navbar.js

@@ -6,17 +6,14 @@
       var desktop_navbar = [];
 
       if (_.settings.forum_branding_display) {
-        desktop_navbar.push(
-          m('a.navbar-brand', {href: _.router.url('misago:index')}, [
-            m('img', {
-              src: _.router.staticUrl('misago/img/site-logo.png'),
-              alt: _.settings.forum_name
-            }),
-            _.settings.forum_branding_text
-          ])
-        );
+        desktop_navbar.push(_.component(ns.BrandFull, _.settings.forum_branding_text));
       }
 
+      desktop_navbar.push(m('ul.nav.navbar-nav', [
+        m('li', m("a", {config: m.route, href: _.router.url('index')}, 'Index')),
+        m('li', m("a", {config: m.route, href: _.router.url('test')}, 'Test'))
+      ]));
+
       return m('nav.navbar.navbar-default.navbar-static-top[role="navigation"]', [
         m('.container.navbar-full.hidden-xs.hidden-sm', desktop_navbar)
       ]);

+ 13 - 0
misago/frontend/misago/components/page-header.js

@@ -0,0 +1,13 @@
+(function (ns) {
+  'use strict';
+
+  ns.PageHeader = {
+    view: function(ctrl, options) {
+      return m('.page-header',
+        m('.container', [
+          m('h1', options.title),
+        ])
+      );
+    }
+  };
+}(Misago.prototype));

+ 0 - 0
misago/frontend/misago/models/factory.js


+ 77 - 0
misago/frontend/misago/services/api.js

@@ -0,0 +1,77 @@
+(function (ns) {
+  'use strict';
+
+  var Api = function(_) {
+    // Ajax implementation
+    var cookie_regex = new RegExp(_.preloaded_data.CSRF_COOKIE_NAME + '\=([^;]*)');
+    this.csrf_token = ns.get(document.cookie.match(cookie_regex), 0).split('=')[1];
+
+    this.ajax = function(method, url, data, progress) {
+      var deferred = m.deferred();
+
+      var ajax_settings = {
+        url: url,
+        method: method,
+        headers: {
+          'X-CSRFToken': this.csrf_token
+        },
+
+        data: data | {},
+        dataType: 'json',
+
+        success: function(data) {
+          deferred.resolve(data);
+        },
+        error: function(jqXHR) {
+          deferred.reject(jqXHR);
+        }
+      };
+
+      if (progress) {
+        return; // not implemented... yet!
+      }
+
+      $.ajax(ajax_settings);
+      return deferred.promise;
+    };
+
+    this.get = function(url) {
+      var preloaded_data = ns.pop(_.preloaded_data, url);
+      if (preloaded_data) {
+        var deferred = m.deferred();
+        deferred.resolve(preloaded_data);
+        return deferred.promise;
+      } else {
+        return this.ajax('GET', url);
+      }
+    };
+
+    this.post = function(url) {
+      return this.ajax('POST', url);
+    };
+
+    // API
+    this.buildUrl = function(model, call, querystrings) {
+      var url = _.router.base_url;
+      url += 'api/' + model + '/';
+      return url;
+    };
+
+    this.one = function(model, id) {
+      var url = this.buildUrl(model) + id + '/';
+      return this.get(url);
+    };
+
+    this.many = function(model, filters) {
+
+    };
+
+    this.call = function(model, target, call, data) {
+
+    };
+  };
+
+  ns.Api = function(_) {
+    return new Api(_);
+  };
+}(Misago.prototype));

+ 4 - 4
misago/frontend/misago/services/outlet.js

@@ -3,15 +3,15 @@
 
   ns.Outlet = {
     factory: function(_) {
-      if (_._outlet) {
-        m.mount(document.getElementById(_._outlet),
+      if (_.setup.fixture) {
+        m.mount(document.getElementById(_.setup.fixture),
                 _.component(ns.ForumLayout));
       }
     },
 
     destroy: function(_) {
-      if (_._outlet) {
-        m.mount(_._outlet, null);
+      if (_.setup.fixture) {
+        m.mount(_.setup.fixture, null);
       }
     }
   };

+ 105 - 11
misago/frontend/misago/services/router.js

@@ -1,25 +1,119 @@
 (function (ns) {
   'use strict';
 
-  var prefixUrl = function(prefix) {
-    return function(url) {
-      return prefix + url;
-    };
-  };
-
   var Router = function(_) {
+    var self = this;
     this.base_url = $('base').attr('href');
 
-    this.url = function() {
-      return '/';
+    this.static_url = ns.get(_.preloaded_data, 'STATIC_URL', '/');
+    this.media_url = ns.get(_.preloaded_data, 'MEDIA_URL', '/');
+
+    // Routing
+    this.urls = {};
+    this.reverses = {};
+
+    var populatePatterns = function(urlconf) {
+      urlconf.patterns().forEach(function(url) {
+        // set service container on component
+        url.component.container = _;
+
+        var final_pattern = self.base_url + url.pattern;
+        final_pattern = final_pattern.replace('//', '/');
+
+        self.urls[final_pattern] = url.component;
+        self.reverses[url.name] = final_pattern;
+      });
+    };
+
+    this.startRouting = function(urlconf, fixture) {
+      populatePatterns(urlconf);
+      this.fixture = fixture;
+
+      m.route.mode = 'pathname';
+      m.route(fixture, '/', this.urls);
+    };
+
+    this.url = function(name) {
+      return this.reverses[name];
+    };
+
+    // Delegate clicks
+    this.delegate_element = null;
+    this.delegate_name = 'click.misago-router';
+
+    this.cleanUrl = function(url) {
+      if (!url) { return; }
+
+      // Is link relative?
+      var is_relative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';
+
+      // If link contains host, validate to see if its outgoing
+      if (!is_relative) {
+        var location = window.location;
+
+        // If protocol matches current one, strip it from string
+        // otherwhise stop handler
+        if (url.substr(0, 2) !== '//') {
+          var protocol = url.substr(0, location.protocol.length + 2);
+          if (protocol !== location.protocol + '//') { return; }
+          url = url.substr(location.protocol.length + 2);
+        } else {
+          url = url.substr(2);
+        }
+
+        // Host checks out?
+        if (url.substr(0, location.host.length) !== location.host) { return; }
+        url = url.substr(location.host.length);
+      }
+
+      // Is link within Ember app?
+      if (url.substr(0, this.base_url.length) !== this.base_url) { return; }
+
+      // Is link to media/static/avatar server?
+      if (url.substr(0, this.static_url.length) === this.static_url) { return; }
+
+      if (url.substr(0, this.media_url.length) === this.media_url) { return; }
+
+      var avatars_url = '/user-avatar/';
+      if (url.substr(0, avatars_url.length) === avatars_url) { return; }
+
+      return url;
     };
 
-    // Media/Static url functions
-    this.staticUrl = prefixUrl(_.get(_.preloaded_data, 'STATIC_URL', '/'));
-    this.mediaUrl = prefixUrl(_.get(_.preloaded_data, 'MEDIA_URL', '/'));
+    this.delegateClicks = function(element) {
+      this.delegate_element = element;
+      $(this.delegate_element).on(this.delegate_name, 'a', function(e) {
+        var clean_url = self.cleanUrl(e.target.href);
+        if (clean_url) {
+          if (clean_url != m.route()) {
+            m.route(clean_url);
+          }
+          e.preventDefault();
+        }
+      });
+    };
+
+    this.destroy = function() {
+      $(this.delegate_element).off(this.delegate_name);
+    };
+
+    // Media/Static url
+    var prefixUrl = function(prefix) {
+      return function(url) {
+        return prefix + url;
+      };
+    };
+
+    this.staticUrl = prefixUrl(ns.get(_.preloaded_data, 'STATIC_URL', '/'));
+    this.mediaUrl = prefixUrl(ns.get(_.preloaded_data, 'MEDIA_URL', '/'));
   };
 
   ns.RouterFactory = function(_) {
     return new Router(_);
   };
+
+  ns.startRouting = function(_) {
+    _.router.startRouting(ns.urls, document.getElementById('router-fixture'));
+    _.router.delegateClicks(document.getElementById(_.setup.fixture));
+  };
 }(Misago.prototype));

+ 31 - 0
misago/frontend/misago/services/title.js

@@ -0,0 +1,31 @@
+(function (ns) {
+  'use strict';
+
+  ns.PageTitle = function(_) {
+    _._setTitle = function(title) {
+      if (typeof title === 'string') {
+        title = {title: title};
+      }
+
+      var complete_title = title.title;
+
+      if (typeof title.page !== 'undefined' && title.page > 1) {
+        complete_title += ' (' + interpolate(gettext('page %(page)s'), { page:title.page }, true) + ')';
+      }
+
+      if (typeof title.parent !== 'undefined') {
+        complete_title += ' | ' + title.parent;
+      }
+
+      document.title = complete_title + ' | ' + this.settings.forum_name;
+    };
+
+    _.setTitle = function(title) {
+      if (title) {
+        this._setTitle(title);
+      } else {
+        document.title = this.settings.forum_name;
+      }
+    };
+  };
+}(Misago.prototype));

+ 2 - 0
misago/frontend/misago/style/misago.less

@@ -32,6 +32,7 @@
 @import "@{bs}buttons.less";
 
 // Components
+@import "@{bs}navs.less";
 @import "@{bs}navbar.less";
 
 // Utility classes
@@ -44,6 +45,7 @@
 // --------------------------------------------------
 
 // Components
+@import "misago/loaders.less";
 @import "misago/navbar.less";
 
 

+ 102 - 0
misago/frontend/misago/style/misago/loaders.less

@@ -0,0 +1,102 @@
+//
+// Misago Loaders
+// --------------------------------------------------
+
+
+.loader {
+  &.sk-folding-cube {
+    margin: @loader-vertical-margin auto;
+    width: @loader-size;
+    height: @loader-size;
+    position: relative;
+    -webkit-transform: rotateZ(45deg);
+            transform: rotateZ(45deg);
+  }
+
+  &.sk-folding-cube .sk-cube {
+    float: left;
+    width: 50%;
+    height: 50%;
+    position: relative;
+    -webkit-transform: scale(1.1);
+        -ms-transform: scale(1.1);
+            transform: scale(1.1);
+  }
+
+  &.sk-folding-cube .sk-cube:before {
+    content: '';
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background-color: @loader-color;
+    -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both;
+            animation: sk-foldCubeAngle 2.4s infinite linear both;
+    -webkit-transform-origin: 100% 100%;
+        -ms-transform-origin: 100% 100%;
+            transform-origin: 100% 100%;
+  }
+
+  &.sk-folding-cube .sk-cube2 {
+    -webkit-transform: scale(1.1) rotateZ(90deg);
+            transform: scale(1.1) rotateZ(90deg);
+  }
+
+  &.sk-folding-cube .sk-cube3 {
+    -webkit-transform: scale(1.1) rotateZ(180deg);
+            transform: scale(1.1) rotateZ(180deg);
+  }
+
+  &.sk-folding-cube .sk-cube4 {
+    -webkit-transform: scale(1.1) rotateZ(270deg);
+            transform: scale(1.1) rotateZ(270deg);
+  }
+
+  &.sk-folding-cube .sk-cube2:before {
+    -webkit-animation-delay: 0.3s;
+            animation-delay: 0.3s;
+  }
+
+  &.sk-folding-cube .sk-cube3:before {
+    -webkit-animation-delay: 0.6s;
+            animation-delay: 0.6s;
+  }
+
+  &.sk-folding-cube .sk-cube4:before {
+    -webkit-animation-delay: 0.9s;
+            animation-delay: 0.9s;
+  }
+
+  @-webkit-keyframes sk-foldCubeAngle {
+    0%, 10% {
+      -webkit-transform: perspective(140px) rotateX(-180deg);
+              transform: perspective(140px) rotateX(-180deg);
+      opacity: 0;
+    } 25%, 75% {
+      -webkit-transform: perspective(140px) rotateX(0deg);
+              transform: perspective(140px) rotateX(0deg);
+      opacity: 1;
+    } 90%, 100% {
+      -webkit-transform: perspective(140px) rotateY(180deg);
+              transform: perspective(140px) rotateY(180deg);
+      opacity: 0;
+    }
+  }
+
+  @keyframes sk-foldCubeAngle {
+    0%, 10% {
+      -webkit-transform: perspective(140px) rotateX(-180deg);
+              transform: perspective(140px) rotateX(-180deg);
+      opacity: 0;
+    } 25%, 75% {
+      -webkit-transform: perspective(140px) rotateX(0deg);
+              transform: perspective(140px) rotateX(0deg);
+      opacity: 1;
+    } 90%, 100% {
+      -webkit-transform: perspective(140px) rotateY(180deg);
+              transform: perspective(140px) rotateY(180deg);
+      opacity: 0;
+    }
+  }
+}

+ 12 - 0
misago/frontend/misago/style/misago/variables.less

@@ -1,3 +1,15 @@
 //
 // Misago Default Theme Variables
 // --------------------------------------------------
+
+
+//== Loaders
+//
+//## Loaders appearance and spacing.
+
+//** Full loader vertical margin
+@loader-vertical-margin: 80px;
+//** Full loader size (both width and height)
+@loader-size: 80px;
+//** Loader color
+@loader-color: @gray-light;

+ 12 - 0
misago/frontend/misago/urls.js

@@ -0,0 +1,12 @@
+(function (ns, UrlConf) {
+  'use strict';
+
+  var urls = new UrlConf();
+  urls.url('/', ns.IndexPage, 'index');
+
+  // Legal pages
+  urls.url('/terms-of-service/', ns.TermsOfServicePage, 'terms_of_service');
+  urls.url('/privacy-policy/', ns.PrivacyPolicyPage, 'privacy_policy');
+
+  ns.urls = urls;
+} (Misago.prototype, Misago.prototype.UrlConf));

+ 11 - 0
misago/frontend/misago/utils/strings.js

@@ -0,0 +1,11 @@
+(function (ns) {
+  'use strict';
+
+  ns.startsWith = function(string, beginning) {
+    return string.indexOf(beginning) === 0;
+  };
+
+  ns.endsWith = function(string, tail) {
+    return string.indexOf(tail, string.length - tail.length) !== -1;
+  };
+}(Misago.prototype));

+ 2 - 2
misago/frontend/misago/utils/urlconf.js

@@ -1,7 +1,7 @@
 (function (ns) {
   'use strict';
 
-  ns.UrlConfInvalidComponent = function() {
+  ns.UrlConfInvalidComponentError = function() {
     this.message = 'component argument should be array or object';
   };
 
@@ -27,7 +27,7 @@
 
     this.url = function(pattern, component, name) {
       if (typeof component !== 'object') {
-        throw new ns.UrlConfInvalidComponent();
+        throw new ns.UrlConfInvalidComponentError();
       }
 
       if (pattern === '') {

+ 7 - 0
misago/frontend/misago/utils/views-shortcuts.js

@@ -0,0 +1,7 @@
+(function (ns) {
+  'use strict';
+
+  ns.loadingPage = function(_) {
+    return m('.page.page-loading', _.component(ns.Loader));
+  };
+} (Misago.prototype));

+ 7 - 0
misago/frontend/package.json

@@ -15,6 +15,13 @@
       "QUnit",
       "Misago",
       "m",
+      "moment",
+      "gettext",
+      "ngettext",
+      "gettext_noop",
+      "pgettext",
+      "npgettext",
+      "interpolate",
       "console",
       "document",
       "window",

+ 1 - 1
misago/frontend/test/index.html

@@ -11,8 +11,8 @@
   <div id="qunit-fixture"></div>
   <script src="//code.jquery.com/qunit/qunit-1.18.0.js"></script>
   <script src="/dist/js/vendor.js"></script>
-  <script src="/dist/js/misago.js"></script>
   <script src="/dist/utils.js"></script>
+  <script src="/dist/js/misago.js"></script>
   <script src="/dist/tests.js"></script>
 </body>
 </html>

+ 2 - 2
misago/frontend/test/tests/unit/service-container.js

@@ -117,8 +117,8 @@
   QUnit.test("initialization data is stored on container", function(assert) {
     assert.expect();
 
-    container.init({outlet: 'test'});
+    container.init({fixture: 'test'});
 
-    assert.equal(container.setup.outlet, 'test', 'container stored initialization data');
+    assert.equal(container.setup.fixture, 'test', 'container stored initialization data');
   });
 }());

+ 23 - 0
misago/frontend/test/tests/unit/string-utils.js

@@ -0,0 +1,23 @@
+(function (startsWith, endsWith) {
+  'use strict';
+
+  QUnit.module("String Utils");
+
+  QUnit.test("startsWith utility", function(assert) {
+    assert.expect(4);
+
+    assert.ok(startsWith("Boberson", "Bob"), 'found string at beginning of other string');
+    assert.ok(!startsWith("Boberson", "bob"), 'function is case sensitive');
+    assert.ok(!startsWith("Bob", "Boberson"), 'failed to find string at beginning of other string');
+    assert.ok(!startsWith("", "Boberson"), 'tested empty string');
+  });
+
+  QUnit.test("endsWith utility", function(assert) {
+    assert.expect(4);
+
+    assert.ok(endsWith("Boberson", "son"), 'found string at the end of other string');
+    assert.ok(!endsWith("Boberson", "Son"), 'function is case sensitive');
+    assert.ok(!endsWith("Bob", "Boberson"), 'failed to find string at the end of other string');
+    assert.ok(!endsWith("", "Boberson"), 'tested empty string');
+  });
+}(Misago.prototype.startsWith, Misago.prototype.endsWith));

+ 87 - 0
misago/frontend/test/utils/django-js-catalog.js

@@ -0,0 +1,87 @@
+// Empty Django JavaScript Catalog
+// jshint ignore: start
+(function (globals) {
+
+  var django = globals.django || (globals.django = {});
+
+  django.pluralidx = function (count) { return (count == 1) ? 0 : 1; };
+
+  /* gettext identity library */
+
+  django.gettext = function (msgid) { return msgid; };
+  django.ngettext = function (singular, plural, count) { return (count == 1) ? singular : plural; };
+  django.gettext_noop = function (msgid) { return msgid; };
+  django.pgettext = function (context, msgid) { return msgid; };
+  django.npgettext = function (context, singular, plural, count) { return (count == 1) ? singular : plural; };
+
+
+  django.interpolate = function (fmt, obj, named) {
+    if (named) {
+      return fmt.replace(/%\(\w+\)s/g, function(match){return String(obj[match.slice(2,-2)])});
+    } else {
+      return fmt.replace(/%s/g, function(match){return String(obj.shift())});
+    }
+  };
+
+
+  /* formatting library */
+
+  django.formats = {
+    "DATETIME_FORMAT": "N j, Y, P",
+    "DATETIME_INPUT_FORMATS": [
+      "%Y-%m-%d %H:%M:%S",
+      "%Y-%m-%d %H:%M:%S.%f",
+      "%Y-%m-%d %H:%M",
+      "%Y-%m-%d",
+      "%m/%d/%Y %H:%M:%S",
+      "%m/%d/%Y %H:%M:%S.%f",
+      "%m/%d/%Y %H:%M",
+      "%m/%d/%Y",
+      "%m/%d/%y %H:%M:%S",
+      "%m/%d/%y %H:%M:%S.%f",
+      "%m/%d/%y %H:%M",
+      "%m/%d/%y"
+    ],
+    "DATE_FORMAT": "N j, Y",
+    "DATE_INPUT_FORMATS": [
+      "%Y-%m-%d",
+      "%m/%d/%Y",
+      "%m/%d/%y"
+    ],
+    "DECIMAL_SEPARATOR": ".",
+    "FIRST_DAY_OF_WEEK": "0",
+    "MONTH_DAY_FORMAT": "F j",
+    "NUMBER_GROUPING": "3",
+    "SHORT_DATETIME_FORMAT": "m/d/Y P",
+    "SHORT_DATE_FORMAT": "m/d/Y",
+    "THOUSAND_SEPARATOR": ",",
+    "TIME_FORMAT": "P",
+    "TIME_INPUT_FORMATS": [
+      "%H:%M:%S",
+      "%H:%M:%S.%f",
+      "%H:%M"
+    ],
+    "YEAR_MONTH_FORMAT": "F Y"
+  };
+
+  django.get_format = function (format_type) {
+    var value = django.formats[format_type];
+    if (typeof(value) == 'undefined') {
+      return format_type;
+    } else {
+      return value;
+    }
+  };
+
+  /* add to global namespace */
+  window.pluralidx = django.pluralidx;
+  window.gettext = django.gettext;
+  window.ngettext = django.ngettext;
+  window.gettext_noop = django.gettext_noop;
+  window.pgettext = django.pgettext;
+  window.npgettext = django.npgettext;
+  window.interpolate = django.interpolate;
+  window.get_format = django.get_format;
+
+}(this));
+

+ 1 - 3495
misago/static/misago/css/misago.css

@@ -1,3495 +1 @@
-/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
-html {
-  font-family: sans-serif;
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%;
-}
-body {
-  margin: 0;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-menu,
-nav,
-section,
-summary {
-  display: block;
-}
-audio,
-canvas,
-progress,
-video {
-  display: inline-block;
-  vertical-align: baseline;
-}
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-[hidden],
-template {
-  display: none;
-}
-a {
-  background-color: transparent;
-}
-a:active,
-a:hover {
-  outline: 0;
-}
-abbr[title] {
-  border-bottom: 1px dotted;
-}
-b,
-strong {
-  font-weight: bold;
-}
-dfn {
-  font-style: italic;
-}
-h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-mark {
-  background: #ff0;
-  color: #000;
-}
-small {
-  font-size: 80%;
-}
-sub,
-sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline;
-}
-sup {
-  top: -0.5em;
-}
-sub {
-  bottom: -0.25em;
-}
-img {
-  border: 0;
-}
-svg:not(:root) {
-  overflow: hidden;
-}
-figure {
-  margin: 1em 40px;
-}
-hr {
-  box-sizing: content-box;
-  height: 0;
-}
-pre {
-  overflow: auto;
-}
-code,
-kbd,
-pre,
-samp {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-button,
-input,
-optgroup,
-select,
-textarea {
-  color: inherit;
-  font: inherit;
-  margin: 0;
-}
-button {
-  overflow: visible;
-}
-button,
-select {
-  text-transform: none;
-}
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
-  -webkit-appearance: button;
-  cursor: pointer;
-}
-button[disabled],
-html input[disabled] {
-  cursor: default;
-}
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  border: 0;
-  padding: 0;
-}
-input {
-  line-height: normal;
-}
-input[type="checkbox"],
-input[type="radio"] {
-  box-sizing: border-box;
-  padding: 0;
-}
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
-  height: auto;
-}
-input[type="search"] {
-  -webkit-appearance: textfield;
-  box-sizing: content-box;
-}
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-fieldset {
-  border: 1px solid #c0c0c0;
-  margin: 0 2px;
-  padding: 0.35em 0.625em 0.75em;
-}
-legend {
-  border: 0;
-  padding: 0;
-}
-textarea {
-  overflow: auto;
-}
-optgroup {
-  font-weight: bold;
-}
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-td,
-th {
-  padding: 0;
-}
-/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
-@media print {
-  *,
-  *:before,
-  *:after {
-    background: transparent !important;
-    color: #000 !important;
-    box-shadow: none !important;
-    text-shadow: none !important;
-  }
-  a,
-  a:visited {
-    text-decoration: underline;
-  }
-  a[href]:after {
-    content: " (" attr(href) ")";
-  }
-  abbr[title]:after {
-    content: " (" attr(title) ")";
-  }
-  a[href^="#"]:after,
-  a[href^="javascript:"]:after {
-    content: "";
-  }
-  pre,
-  blockquote {
-    border: 1px solid #999;
-    page-break-inside: avoid;
-  }
-  thead {
-    display: table-header-group;
-  }
-  tr,
-  img {
-    page-break-inside: avoid;
-  }
-  img {
-    max-width: 100% !important;
-  }
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3;
-  }
-  h2,
-  h3 {
-    page-break-after: avoid;
-  }
-  .navbar {
-    display: none;
-  }
-  .btn > .caret,
-  .dropup > .btn > .caret {
-    border-top-color: #000 !important;
-  }
-  .label {
-    border: 1px solid #000;
-  }
-  .table {
-    border-collapse: collapse !important;
-  }
-  .table td,
-  .table th {
-    background-color: #fff !important;
-  }
-  .table-bordered th,
-  .table-bordered td {
-    border: 1px solid #ddd !important;
-  }
-}
-* {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-*:before,
-*:after {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-html {
-  font-size: 10px;
-  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-body {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 14px;
-  line-height: 1.42857143;
-  color: #333333;
-  background-color: #ffffff;
-}
-input,
-button,
-select,
-textarea {
-  font-family: inherit;
-  font-size: inherit;
-  line-height: inherit;
-}
-a {
-  color: #337ab7;
-  text-decoration: none;
-}
-a:hover,
-a:focus {
-  color: #23527c;
-  text-decoration: underline;
-}
-a:focus {
-  outline: thin dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-figure {
-  margin: 0;
-}
-img {
-  vertical-align: middle;
-}
-.img-responsive {
-  display: block;
-  max-width: 100%;
-  height: auto;
-}
-.img-rounded {
-  border-radius: 6px;
-}
-.img-thumbnail {
-  padding: 4px;
-  line-height: 1.42857143;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-radius: 4px;
-  -webkit-transition: all 0.2s ease-in-out;
-  -o-transition: all 0.2s ease-in-out;
-  transition: all 0.2s ease-in-out;
-  display: inline-block;
-  max-width: 100%;
-  height: auto;
-}
-.img-circle {
-  border-radius: 50%;
-}
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eeeeee;
-}
-.sr-only {
-  position: absolute;
-  width: 1px;
-  height: 1px;
-  margin: -1px;
-  padding: 0;
-  overflow: hidden;
-  clip: rect(0, 0, 0, 0);
-  border: 0;
-}
-.sr-only-focusable:active,
-.sr-only-focusable:focus {
-  position: static;
-  width: auto;
-  height: auto;
-  margin: 0;
-  overflow: visible;
-  clip: auto;
-}
-[role="button"] {
-  cursor: pointer;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-.h1,
-.h2,
-.h3,
-.h4,
-.h5,
-.h6 {
-  font-family: inherit;
-  font-weight: 500;
-  line-height: 1.1;
-  color: inherit;
-}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small,
-.h1 small,
-.h2 small,
-.h3 small,
-.h4 small,
-.h5 small,
-.h6 small,
-h1 .small,
-h2 .small,
-h3 .small,
-h4 .small,
-h5 .small,
-h6 .small,
-.h1 .small,
-.h2 .small,
-.h3 .small,
-.h4 .small,
-.h5 .small,
-.h6 .small {
-  font-weight: normal;
-  line-height: 1;
-  color: #777777;
-}
-h1,
-.h1,
-h2,
-.h2,
-h3,
-.h3 {
-  margin-top: 20px;
-  margin-bottom: 10px;
-}
-h1 small,
-.h1 small,
-h2 small,
-.h2 small,
-h3 small,
-.h3 small,
-h1 .small,
-.h1 .small,
-h2 .small,
-.h2 .small,
-h3 .small,
-.h3 .small {
-  font-size: 65%;
-}
-h4,
-.h4,
-h5,
-.h5,
-h6,
-.h6 {
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-h4 small,
-.h4 small,
-h5 small,
-.h5 small,
-h6 small,
-.h6 small,
-h4 .small,
-.h4 .small,
-h5 .small,
-.h5 .small,
-h6 .small,
-.h6 .small {
-  font-size: 75%;
-}
-h1,
-.h1 {
-  font-size: 36px;
-}
-h2,
-.h2 {
-  font-size: 30px;
-}
-h3,
-.h3 {
-  font-size: 24px;
-}
-h4,
-.h4 {
-  font-size: 18px;
-}
-h5,
-.h5 {
-  font-size: 14px;
-}
-h6,
-.h6 {
-  font-size: 12px;
-}
-p {
-  margin: 0 0 10px;
-}
-.lead {
-  margin-bottom: 20px;
-  font-size: 16px;
-  font-weight: 300;
-  line-height: 1.4;
-}
-@media (min-width: 768px) {
-  .lead {
-    font-size: 21px;
-  }
-}
-small,
-.small {
-  font-size: 85%;
-}
-mark,
-.mark {
-  background-color: #fcf8e3;
-  padding: .2em;
-}
-.text-left {
-  text-align: left;
-}
-.text-right {
-  text-align: right;
-}
-.text-center {
-  text-align: center;
-}
-.text-justify {
-  text-align: justify;
-}
-.text-nowrap {
-  white-space: nowrap;
-}
-.text-lowercase {
-  text-transform: lowercase;
-}
-.text-uppercase {
-  text-transform: uppercase;
-}
-.text-capitalize {
-  text-transform: capitalize;
-}
-.text-muted {
-  color: #777777;
-}
-.text-primary {
-  color: #337ab7;
-}
-a.text-primary:hover,
-a.text-primary:focus {
-  color: #286090;
-}
-.text-success {
-  color: #3c763d;
-}
-a.text-success:hover,
-a.text-success:focus {
-  color: #2b542c;
-}
-.text-info {
-  color: #31708f;
-}
-a.text-info:hover,
-a.text-info:focus {
-  color: #245269;
-}
-.text-warning {
-  color: #8a6d3b;
-}
-a.text-warning:hover,
-a.text-warning:focus {
-  color: #66512c;
-}
-.text-danger {
-  color: #a94442;
-}
-a.text-danger:hover,
-a.text-danger:focus {
-  color: #843534;
-}
-.bg-primary {
-  color: #fff;
-  background-color: #337ab7;
-}
-a.bg-primary:hover,
-a.bg-primary:focus {
-  background-color: #286090;
-}
-.bg-success {
-  background-color: #dff0d8;
-}
-a.bg-success:hover,
-a.bg-success:focus {
-  background-color: #c1e2b3;
-}
-.bg-info {
-  background-color: #d9edf7;
-}
-a.bg-info:hover,
-a.bg-info:focus {
-  background-color: #afd9ee;
-}
-.bg-warning {
-  background-color: #fcf8e3;
-}
-a.bg-warning:hover,
-a.bg-warning:focus {
-  background-color: #f7ecb5;
-}
-.bg-danger {
-  background-color: #f2dede;
-}
-a.bg-danger:hover,
-a.bg-danger:focus {
-  background-color: #e4b9b9;
-}
-.page-header {
-  padding-bottom: 9px;
-  margin: 40px 0 20px;
-  border-bottom: 1px solid #eeeeee;
-}
-ul,
-ol {
-  margin-top: 0;
-  margin-bottom: 10px;
-}
-ul ul,
-ol ul,
-ul ol,
-ol ol {
-  margin-bottom: 0;
-}
-.list-unstyled {
-  padding-left: 0;
-  list-style: none;
-}
-.list-inline {
-  padding-left: 0;
-  list-style: none;
-  margin-left: -5px;
-}
-.list-inline > li {
-  display: inline-block;
-  padding-left: 5px;
-  padding-right: 5px;
-}
-dl {
-  margin-top: 0;
-  margin-bottom: 20px;
-}
-dt,
-dd {
-  line-height: 1.42857143;
-}
-dt {
-  font-weight: bold;
-}
-dd {
-  margin-left: 0;
-}
-@media (min-width: 768px) {
-  .dl-horizontal dt {
-    float: left;
-    width: 160px;
-    clear: left;
-    text-align: right;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-  }
-  .dl-horizontal dd {
-    margin-left: 180px;
-  }
-}
-abbr[title],
-abbr[data-original-title] {
-  cursor: help;
-  border-bottom: 1px dotted #777777;
-}
-.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-blockquote {
-  padding: 10px 20px;
-  margin: 0 0 20px;
-  font-size: 17.5px;
-  border-left: 5px solid #eeeeee;
-}
-blockquote p:last-child,
-blockquote ul:last-child,
-blockquote ol:last-child {
-  margin-bottom: 0;
-}
-blockquote footer,
-blockquote small,
-blockquote .small {
-  display: block;
-  font-size: 80%;
-  line-height: 1.42857143;
-  color: #777777;
-}
-blockquote footer:before,
-blockquote small:before,
-blockquote .small:before {
-  content: '\2014 \00A0';
-}
-.blockquote-reverse,
-blockquote.pull-right {
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid #eeeeee;
-  border-left: 0;
-  text-align: right;
-}
-.blockquote-reverse footer:before,
-blockquote.pull-right footer:before,
-.blockquote-reverse small:before,
-blockquote.pull-right small:before,
-.blockquote-reverse .small:before,
-blockquote.pull-right .small:before {
-  content: '';
-}
-.blockquote-reverse footer:after,
-blockquote.pull-right footer:after,
-.blockquote-reverse small:after,
-blockquote.pull-right small:after,
-.blockquote-reverse .small:after,
-blockquote.pull-right .small:after {
-  content: '\00A0 \2014';
-}
-address {
-  margin-bottom: 20px;
-  font-style: normal;
-  line-height: 1.42857143;
-}
-code,
-kbd,
-pre,
-samp {
-  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
-}
-code {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: #c7254e;
-  background-color: #f9f2f4;
-  border-radius: 4px;
-}
-kbd {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: #ffffff;
-  background-color: #333333;
-  border-radius: 3px;
-  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-kbd kbd {
-  padding: 0;
-  font-size: 100%;
-  font-weight: bold;
-  box-shadow: none;
-}
-pre {
-  display: block;
-  padding: 9.5px;
-  margin: 0 0 10px;
-  font-size: 13px;
-  line-height: 1.42857143;
-  word-break: break-all;
-  word-wrap: break-word;
-  color: #333333;
-  background-color: #f5f5f5;
-  border: 1px solid #cccccc;
-  border-radius: 4px;
-}
-pre code {
-  padding: 0;
-  font-size: inherit;
-  color: inherit;
-  white-space: pre-wrap;
-  background-color: transparent;
-  border-radius: 0;
-}
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-.container {
-  margin-right: auto;
-  margin-left: auto;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-@media (min-width: 768px) {
-  .container {
-    width: 750px;
-  }
-}
-@media (min-width: 992px) {
-  .container {
-    width: 970px;
-  }
-}
-@media (min-width: 1200px) {
-  .container {
-    width: 1170px;
-  }
-}
-.container-fluid {
-  margin-right: auto;
-  margin-left: auto;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-.row {
-  margin-left: -15px;
-  margin-right: -15px;
-}
-.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
-  position: relative;
-  min-height: 1px;
-  padding-left: 15px;
-  padding-right: 15px;
-}
-.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
-  float: left;
-}
-.col-xs-12 {
-  width: 100%;
-}
-.col-xs-11 {
-  width: 91.66666667%;
-}
-.col-xs-10 {
-  width: 83.33333333%;
-}
-.col-xs-9 {
-  width: 75%;
-}
-.col-xs-8 {
-  width: 66.66666667%;
-}
-.col-xs-7 {
-  width: 58.33333333%;
-}
-.col-xs-6 {
-  width: 50%;
-}
-.col-xs-5 {
-  width: 41.66666667%;
-}
-.col-xs-4 {
-  width: 33.33333333%;
-}
-.col-xs-3 {
-  width: 25%;
-}
-.col-xs-2 {
-  width: 16.66666667%;
-}
-.col-xs-1 {
-  width: 8.33333333%;
-}
-.col-xs-pull-12 {
-  right: 100%;
-}
-.col-xs-pull-11 {
-  right: 91.66666667%;
-}
-.col-xs-pull-10 {
-  right: 83.33333333%;
-}
-.col-xs-pull-9 {
-  right: 75%;
-}
-.col-xs-pull-8 {
-  right: 66.66666667%;
-}
-.col-xs-pull-7 {
-  right: 58.33333333%;
-}
-.col-xs-pull-6 {
-  right: 50%;
-}
-.col-xs-pull-5 {
-  right: 41.66666667%;
-}
-.col-xs-pull-4 {
-  right: 33.33333333%;
-}
-.col-xs-pull-3 {
-  right: 25%;
-}
-.col-xs-pull-2 {
-  right: 16.66666667%;
-}
-.col-xs-pull-1 {
-  right: 8.33333333%;
-}
-.col-xs-pull-0 {
-  right: auto;
-}
-.col-xs-push-12 {
-  left: 100%;
-}
-.col-xs-push-11 {
-  left: 91.66666667%;
-}
-.col-xs-push-10 {
-  left: 83.33333333%;
-}
-.col-xs-push-9 {
-  left: 75%;
-}
-.col-xs-push-8 {
-  left: 66.66666667%;
-}
-.col-xs-push-7 {
-  left: 58.33333333%;
-}
-.col-xs-push-6 {
-  left: 50%;
-}
-.col-xs-push-5 {
-  left: 41.66666667%;
-}
-.col-xs-push-4 {
-  left: 33.33333333%;
-}
-.col-xs-push-3 {
-  left: 25%;
-}
-.col-xs-push-2 {
-  left: 16.66666667%;
-}
-.col-xs-push-1 {
-  left: 8.33333333%;
-}
-.col-xs-push-0 {
-  left: auto;
-}
-.col-xs-offset-12 {
-  margin-left: 100%;
-}
-.col-xs-offset-11 {
-  margin-left: 91.66666667%;
-}
-.col-xs-offset-10 {
-  margin-left: 83.33333333%;
-}
-.col-xs-offset-9 {
-  margin-left: 75%;
-}
-.col-xs-offset-8 {
-  margin-left: 66.66666667%;
-}
-.col-xs-offset-7 {
-  margin-left: 58.33333333%;
-}
-.col-xs-offset-6 {
-  margin-left: 50%;
-}
-.col-xs-offset-5 {
-  margin-left: 41.66666667%;
-}
-.col-xs-offset-4 {
-  margin-left: 33.33333333%;
-}
-.col-xs-offset-3 {
-  margin-left: 25%;
-}
-.col-xs-offset-2 {
-  margin-left: 16.66666667%;
-}
-.col-xs-offset-1 {
-  margin-left: 8.33333333%;
-}
-.col-xs-offset-0 {
-  margin-left: 0%;
-}
-@media (min-width: 768px) {
-  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
-    float: left;
-  }
-  .col-sm-12 {
-    width: 100%;
-  }
-  .col-sm-11 {
-    width: 91.66666667%;
-  }
-  .col-sm-10 {
-    width: 83.33333333%;
-  }
-  .col-sm-9 {
-    width: 75%;
-  }
-  .col-sm-8 {
-    width: 66.66666667%;
-  }
-  .col-sm-7 {
-    width: 58.33333333%;
-  }
-  .col-sm-6 {
-    width: 50%;
-  }
-  .col-sm-5 {
-    width: 41.66666667%;
-  }
-  .col-sm-4 {
-    width: 33.33333333%;
-  }
-  .col-sm-3 {
-    width: 25%;
-  }
-  .col-sm-2 {
-    width: 16.66666667%;
-  }
-  .col-sm-1 {
-    width: 8.33333333%;
-  }
-  .col-sm-pull-12 {
-    right: 100%;
-  }
-  .col-sm-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-sm-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-sm-pull-9 {
-    right: 75%;
-  }
-  .col-sm-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-sm-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-sm-pull-6 {
-    right: 50%;
-  }
-  .col-sm-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-sm-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-sm-pull-3 {
-    right: 25%;
-  }
-  .col-sm-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-sm-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-sm-pull-0 {
-    right: auto;
-  }
-  .col-sm-push-12 {
-    left: 100%;
-  }
-  .col-sm-push-11 {
-    left: 91.66666667%;
-  }
-  .col-sm-push-10 {
-    left: 83.33333333%;
-  }
-  .col-sm-push-9 {
-    left: 75%;
-  }
-  .col-sm-push-8 {
-    left: 66.66666667%;
-  }
-  .col-sm-push-7 {
-    left: 58.33333333%;
-  }
-  .col-sm-push-6 {
-    left: 50%;
-  }
-  .col-sm-push-5 {
-    left: 41.66666667%;
-  }
-  .col-sm-push-4 {
-    left: 33.33333333%;
-  }
-  .col-sm-push-3 {
-    left: 25%;
-  }
-  .col-sm-push-2 {
-    left: 16.66666667%;
-  }
-  .col-sm-push-1 {
-    left: 8.33333333%;
-  }
-  .col-sm-push-0 {
-    left: auto;
-  }
-  .col-sm-offset-12 {
-    margin-left: 100%;
-  }
-  .col-sm-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-sm-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-sm-offset-9 {
-    margin-left: 75%;
-  }
-  .col-sm-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-sm-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-sm-offset-6 {
-    margin-left: 50%;
-  }
-  .col-sm-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-sm-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-sm-offset-3 {
-    margin-left: 25%;
-  }
-  .col-sm-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-sm-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-sm-offset-0 {
-    margin-left: 0%;
-  }
-}
-@media (min-width: 992px) {
-  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
-    float: left;
-  }
-  .col-md-12 {
-    width: 100%;
-  }
-  .col-md-11 {
-    width: 91.66666667%;
-  }
-  .col-md-10 {
-    width: 83.33333333%;
-  }
-  .col-md-9 {
-    width: 75%;
-  }
-  .col-md-8 {
-    width: 66.66666667%;
-  }
-  .col-md-7 {
-    width: 58.33333333%;
-  }
-  .col-md-6 {
-    width: 50%;
-  }
-  .col-md-5 {
-    width: 41.66666667%;
-  }
-  .col-md-4 {
-    width: 33.33333333%;
-  }
-  .col-md-3 {
-    width: 25%;
-  }
-  .col-md-2 {
-    width: 16.66666667%;
-  }
-  .col-md-1 {
-    width: 8.33333333%;
-  }
-  .col-md-pull-12 {
-    right: 100%;
-  }
-  .col-md-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-md-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-md-pull-9 {
-    right: 75%;
-  }
-  .col-md-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-md-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-md-pull-6 {
-    right: 50%;
-  }
-  .col-md-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-md-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-md-pull-3 {
-    right: 25%;
-  }
-  .col-md-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-md-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-md-pull-0 {
-    right: auto;
-  }
-  .col-md-push-12 {
-    left: 100%;
-  }
-  .col-md-push-11 {
-    left: 91.66666667%;
-  }
-  .col-md-push-10 {
-    left: 83.33333333%;
-  }
-  .col-md-push-9 {
-    left: 75%;
-  }
-  .col-md-push-8 {
-    left: 66.66666667%;
-  }
-  .col-md-push-7 {
-    left: 58.33333333%;
-  }
-  .col-md-push-6 {
-    left: 50%;
-  }
-  .col-md-push-5 {
-    left: 41.66666667%;
-  }
-  .col-md-push-4 {
-    left: 33.33333333%;
-  }
-  .col-md-push-3 {
-    left: 25%;
-  }
-  .col-md-push-2 {
-    left: 16.66666667%;
-  }
-  .col-md-push-1 {
-    left: 8.33333333%;
-  }
-  .col-md-push-0 {
-    left: auto;
-  }
-  .col-md-offset-12 {
-    margin-left: 100%;
-  }
-  .col-md-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-md-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-md-offset-9 {
-    margin-left: 75%;
-  }
-  .col-md-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-md-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-md-offset-6 {
-    margin-left: 50%;
-  }
-  .col-md-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-md-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-md-offset-3 {
-    margin-left: 25%;
-  }
-  .col-md-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-md-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-md-offset-0 {
-    margin-left: 0%;
-  }
-}
-@media (min-width: 1200px) {
-  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
-    float: left;
-  }
-  .col-lg-12 {
-    width: 100%;
-  }
-  .col-lg-11 {
-    width: 91.66666667%;
-  }
-  .col-lg-10 {
-    width: 83.33333333%;
-  }
-  .col-lg-9 {
-    width: 75%;
-  }
-  .col-lg-8 {
-    width: 66.66666667%;
-  }
-  .col-lg-7 {
-    width: 58.33333333%;
-  }
-  .col-lg-6 {
-    width: 50%;
-  }
-  .col-lg-5 {
-    width: 41.66666667%;
-  }
-  .col-lg-4 {
-    width: 33.33333333%;
-  }
-  .col-lg-3 {
-    width: 25%;
-  }
-  .col-lg-2 {
-    width: 16.66666667%;
-  }
-  .col-lg-1 {
-    width: 8.33333333%;
-  }
-  .col-lg-pull-12 {
-    right: 100%;
-  }
-  .col-lg-pull-11 {
-    right: 91.66666667%;
-  }
-  .col-lg-pull-10 {
-    right: 83.33333333%;
-  }
-  .col-lg-pull-9 {
-    right: 75%;
-  }
-  .col-lg-pull-8 {
-    right: 66.66666667%;
-  }
-  .col-lg-pull-7 {
-    right: 58.33333333%;
-  }
-  .col-lg-pull-6 {
-    right: 50%;
-  }
-  .col-lg-pull-5 {
-    right: 41.66666667%;
-  }
-  .col-lg-pull-4 {
-    right: 33.33333333%;
-  }
-  .col-lg-pull-3 {
-    right: 25%;
-  }
-  .col-lg-pull-2 {
-    right: 16.66666667%;
-  }
-  .col-lg-pull-1 {
-    right: 8.33333333%;
-  }
-  .col-lg-pull-0 {
-    right: auto;
-  }
-  .col-lg-push-12 {
-    left: 100%;
-  }
-  .col-lg-push-11 {
-    left: 91.66666667%;
-  }
-  .col-lg-push-10 {
-    left: 83.33333333%;
-  }
-  .col-lg-push-9 {
-    left: 75%;
-  }
-  .col-lg-push-8 {
-    left: 66.66666667%;
-  }
-  .col-lg-push-7 {
-    left: 58.33333333%;
-  }
-  .col-lg-push-6 {
-    left: 50%;
-  }
-  .col-lg-push-5 {
-    left: 41.66666667%;
-  }
-  .col-lg-push-4 {
-    left: 33.33333333%;
-  }
-  .col-lg-push-3 {
-    left: 25%;
-  }
-  .col-lg-push-2 {
-    left: 16.66666667%;
-  }
-  .col-lg-push-1 {
-    left: 8.33333333%;
-  }
-  .col-lg-push-0 {
-    left: auto;
-  }
-  .col-lg-offset-12 {
-    margin-left: 100%;
-  }
-  .col-lg-offset-11 {
-    margin-left: 91.66666667%;
-  }
-  .col-lg-offset-10 {
-    margin-left: 83.33333333%;
-  }
-  .col-lg-offset-9 {
-    margin-left: 75%;
-  }
-  .col-lg-offset-8 {
-    margin-left: 66.66666667%;
-  }
-  .col-lg-offset-7 {
-    margin-left: 58.33333333%;
-  }
-  .col-lg-offset-6 {
-    margin-left: 50%;
-  }
-  .col-lg-offset-5 {
-    margin-left: 41.66666667%;
-  }
-  .col-lg-offset-4 {
-    margin-left: 33.33333333%;
-  }
-  .col-lg-offset-3 {
-    margin-left: 25%;
-  }
-  .col-lg-offset-2 {
-    margin-left: 16.66666667%;
-  }
-  .col-lg-offset-1 {
-    margin-left: 8.33333333%;
-  }
-  .col-lg-offset-0 {
-    margin-left: 0%;
-  }
-}
-table {
-  background-color: transparent;
-}
-caption {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  color: #777777;
-  text-align: left;
-}
-th {
-  text-align: left;
-}
-.table {
-  width: 100%;
-  max-width: 100%;
-  margin-bottom: 20px;
-}
-.table > thead > tr > th,
-.table > tbody > tr > th,
-.table > tfoot > tr > th,
-.table > thead > tr > td,
-.table > tbody > tr > td,
-.table > tfoot > tr > td {
-  padding: 8px;
-  line-height: 1.42857143;
-  vertical-align: top;
-  border-top: 1px solid #dddddd;
-}
-.table > thead > tr > th {
-  vertical-align: bottom;
-  border-bottom: 2px solid #dddddd;
-}
-.table > caption + thead > tr:first-child > th,
-.table > colgroup + thead > tr:first-child > th,
-.table > thead:first-child > tr:first-child > th,
-.table > caption + thead > tr:first-child > td,
-.table > colgroup + thead > tr:first-child > td,
-.table > thead:first-child > tr:first-child > td {
-  border-top: 0;
-}
-.table > tbody + tbody {
-  border-top: 2px solid #dddddd;
-}
-.table .table {
-  background-color: #ffffff;
-}
-.table-condensed > thead > tr > th,
-.table-condensed > tbody > tr > th,
-.table-condensed > tfoot > tr > th,
-.table-condensed > thead > tr > td,
-.table-condensed > tbody > tr > td,
-.table-condensed > tfoot > tr > td {
-  padding: 5px;
-}
-.table-bordered {
-  border: 1px solid #dddddd;
-}
-.table-bordered > thead > tr > th,
-.table-bordered > tbody > tr > th,
-.table-bordered > tfoot > tr > th,
-.table-bordered > thead > tr > td,
-.table-bordered > tbody > tr > td,
-.table-bordered > tfoot > tr > td {
-  border: 1px solid #dddddd;
-}
-.table-bordered > thead > tr > th,
-.table-bordered > thead > tr > td {
-  border-bottom-width: 2px;
-}
-.table-striped > tbody > tr:nth-of-type(odd) {
-  background-color: #f9f9f9;
-}
-.table-hover > tbody > tr:hover {
-  background-color: #f5f5f5;
-}
-table 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 > tbody > tr > td.active,
-.table > tfoot > tr > td.active,
-.table > thead > tr > th.active,
-.table > tbody > tr > th.active,
-.table > tfoot > tr > th.active,
-.table > thead > tr.active > td,
-.table > tbody > tr.active > td,
-.table > tfoot > tr.active > td,
-.table > thead > tr.active > th,
-.table > tbody > tr.active > th,
-.table > tfoot > tr.active > th {
-  background-color: #f5f5f5;
-}
-.table-hover > tbody > tr > td.active:hover,
-.table-hover > tbody > tr > th.active:hover,
-.table-hover > tbody > tr.active:hover > td,
-.table-hover > tbody > tr:hover > .active,
-.table-hover > tbody > tr.active:hover > th {
-  background-color: #e8e8e8;
-}
-.table > thead > tr > td.success,
-.table > tbody > tr > td.success,
-.table > tfoot > tr > td.success,
-.table > thead > tr > th.success,
-.table > tbody > tr > th.success,
-.table > tfoot > tr > th.success,
-.table > thead > tr.success > td,
-.table > tbody > tr.success > td,
-.table > tfoot > tr.success > td,
-.table > thead > tr.success > th,
-.table > tbody > tr.success > th,
-.table > tfoot > tr.success > th {
-  background-color: #dff0d8;
-}
-.table-hover > tbody > tr > td.success:hover,
-.table-hover > tbody > tr > th.success:hover,
-.table-hover > tbody > tr.success:hover > td,
-.table-hover > tbody > tr:hover > .success,
-.table-hover > tbody > tr.success:hover > th {
-  background-color: #d0e9c6;
-}
-.table > thead > tr > td.info,
-.table > tbody > tr > td.info,
-.table > tfoot > tr > td.info,
-.table > thead > tr > th.info,
-.table > tbody > tr > th.info,
-.table > tfoot > tr > th.info,
-.table > thead > tr.info > td,
-.table > tbody > tr.info > td,
-.table > tfoot > tr.info > td,
-.table > thead > tr.info > th,
-.table > tbody > tr.info > th,
-.table > tfoot > tr.info > th {
-  background-color: #d9edf7;
-}
-.table-hover > tbody > tr > td.info:hover,
-.table-hover > tbody > tr > th.info:hover,
-.table-hover > tbody > tr.info:hover > td,
-.table-hover > tbody > tr:hover > .info,
-.table-hover > tbody > tr.info:hover > th {
-  background-color: #c4e3f3;
-}
-.table > thead > tr > td.warning,
-.table > tbody > tr > td.warning,
-.table > tfoot > tr > td.warning,
-.table > thead > tr > th.warning,
-.table > tbody > tr > th.warning,
-.table > tfoot > tr > th.warning,
-.table > thead > tr.warning > td,
-.table > tbody > tr.warning > td,
-.table > tfoot > tr.warning > td,
-.table > thead > tr.warning > th,
-.table > tbody > tr.warning > th,
-.table > tfoot > tr.warning > th {
-  background-color: #fcf8e3;
-}
-.table-hover > tbody > tr > td.warning:hover,
-.table-hover > tbody > tr > th.warning:hover,
-.table-hover > tbody > tr.warning:hover > td,
-.table-hover > tbody > tr:hover > .warning,
-.table-hover > tbody > tr.warning:hover > th {
-  background-color: #faf2cc;
-}
-.table > thead > tr > td.danger,
-.table > tbody > tr > td.danger,
-.table > tfoot > tr > td.danger,
-.table > thead > tr > th.danger,
-.table > tbody > tr > th.danger,
-.table > tfoot > tr > th.danger,
-.table > thead > tr.danger > td,
-.table > tbody > tr.danger > td,
-.table > tfoot > tr.danger > td,
-.table > thead > tr.danger > th,
-.table > tbody > tr.danger > th,
-.table > tfoot > tr.danger > th {
-  background-color: #f2dede;
-}
-.table-hover > tbody > tr > td.danger:hover,
-.table-hover > tbody > tr > th.danger:hover,
-.table-hover > tbody > tr.danger:hover > td,
-.table-hover > tbody > tr:hover > .danger,
-.table-hover > tbody > tr.danger:hover > th {
-  background-color: #ebcccc;
-}
-.table-responsive {
-  overflow-x: auto;
-  min-height: 0.01%;
-}
-@media screen and (max-width: 767px) {
-  .table-responsive {
-    width: 100%;
-    margin-bottom: 15px;
-    overflow-y: hidden;
-    -ms-overflow-style: -ms-autohiding-scrollbar;
-    border: 1px solid #dddddd;
-  }
-  .table-responsive > .table {
-    margin-bottom: 0;
-  }
-  .table-responsive > .table > thead > tr > th,
-  .table-responsive > .table > tbody > tr > th,
-  .table-responsive > .table > tfoot > tr > th,
-  .table-responsive > .table > thead > tr > td,
-  .table-responsive > .table > tbody > tr > td,
-  .table-responsive > .table > tfoot > tr > td {
-    white-space: nowrap;
-  }
-  .table-responsive > .table-bordered {
-    border: 0;
-  }
-  .table-responsive > .table-bordered > thead > tr > th:first-child,
-  .table-responsive > .table-bordered > tbody > tr > th:first-child,
-  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
-  .table-responsive > .table-bordered > thead > tr > td:first-child,
-  .table-responsive > .table-bordered > tbody > tr > td:first-child,
-  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
-    border-left: 0;
-  }
-  .table-responsive > .table-bordered > thead > tr > th:last-child,
-  .table-responsive > .table-bordered > tbody > tr > th:last-child,
-  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
-  .table-responsive > .table-bordered > thead > tr > td:last-child,
-  .table-responsive > .table-bordered > tbody > tr > td:last-child,
-  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
-    border-right: 0;
-  }
-  .table-responsive > .table-bordered > tbody > tr:last-child > th,
-  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
-  .table-responsive > .table-bordered > tbody > tr:last-child > td,
-  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
-    border-bottom: 0;
-  }
-}
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-  min-width: 0;
-}
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: 20px;
-  font-size: 21px;
-  line-height: inherit;
-  color: #333333;
-  border: 0;
-  border-bottom: 1px solid #e5e5e5;
-}
-label {
-  display: inline-block;
-  max-width: 100%;
-  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: 14px;
-  line-height: 1.42857143;
-  color: #555555;
-}
-.form-control {
-  display: block;
-  width: 100%;
-  height: 34px;
-  padding: 6px 12px;
-  font-size: 14px;
-  line-height: 1.42857143;
-  color: #555555;
-  background-color: #ffffff;
-  background-image: none;
-  border: 1px solid #cccccc;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-}
-.form-control:focus {
-  border-color: #66afe9;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
-  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
-}
-.form-control::-moz-placeholder {
-  color: #999999;
-  opacity: 1;
-}
-.form-control:-ms-input-placeholder {
-  color: #999999;
-}
-.form-control::-webkit-input-placeholder {
-  color: #999999;
-}
-.form-control[disabled],
-.form-control[readonly],
-fieldset[disabled] .form-control {
-  background-color: #eeeeee;
-  opacity: 1;
-}
-.form-control[disabled],
-fieldset[disabled] .form-control {
-  cursor: not-allowed;
-}
-textarea.form-control {
-  height: auto;
-}
-input[type="search"] {
-  -webkit-appearance: none;
-}
-@media screen and (-webkit-min-device-pixel-ratio: 0) {
-  input[type="date"].form-control,
-  input[type="time"].form-control,
-  input[type="datetime-local"].form-control,
-  input[type="month"].form-control {
-    line-height: 34px;
-  }
-  input[type="date"].input-sm,
-  input[type="time"].input-sm,
-  input[type="datetime-local"].input-sm,
-  input[type="month"].input-sm,
-  .input-group-sm input[type="date"],
-  .input-group-sm input[type="time"],
-  .input-group-sm input[type="datetime-local"],
-  .input-group-sm input[type="month"] {
-    line-height: 30px;
-  }
-  input[type="date"].input-lg,
-  input[type="time"].input-lg,
-  input[type="datetime-local"].input-lg,
-  input[type="month"].input-lg,
-  .input-group-lg input[type="date"],
-  .input-group-lg input[type="time"],
-  .input-group-lg input[type="datetime-local"],
-  .input-group-lg input[type="month"] {
-    line-height: 46px;
-  }
-}
-.form-group {
-  margin-bottom: 15px;
-}
-.radio,
-.checkbox {
-  position: relative;
-  display: block;
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-.radio label,
-.checkbox label {
-  min-height: 20px;
-  padding-left: 20px;
-  margin-bottom: 0;
-  font-weight: normal;
-  cursor: pointer;
-}
-.radio input[type="radio"],
-.radio-inline input[type="radio"],
-.checkbox input[type="checkbox"],
-.checkbox-inline input[type="checkbox"] {
-  position: absolute;
-  margin-left: -20px;
-  margin-top: 4px \9;
-}
-.radio + .radio,
-.checkbox + .checkbox {
-  margin-top: -5px;
-}
-.radio-inline,
-.checkbox-inline {
-  position: relative;
-  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],
-input[type="checkbox"][disabled],
-input[type="radio"].disabled,
-input[type="checkbox"].disabled,
-fieldset[disabled] input[type="radio"],
-fieldset[disabled] input[type="checkbox"] {
-  cursor: not-allowed;
-}
-.radio-inline.disabled,
-.checkbox-inline.disabled,
-fieldset[disabled] .radio-inline,
-fieldset[disabled] .checkbox-inline {
-  cursor: not-allowed;
-}
-.radio.disabled label,
-.checkbox.disabled label,
-fieldset[disabled] .radio label,
-fieldset[disabled] .checkbox label {
-  cursor: not-allowed;
-}
-.form-control-static {
-  padding-top: 7px;
-  padding-bottom: 7px;
-  margin-bottom: 0;
-  min-height: 34px;
-}
-.form-control-static.input-lg,
-.form-control-static.input-sm {
-  padding-left: 0;
-  padding-right: 0;
-}
-.input-sm {
-  height: 30px;
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-select.input-sm {
-  height: 30px;
-  line-height: 30px;
-}
-textarea.input-sm,
-select[multiple].input-sm {
-  height: auto;
-}
-.form-group-sm .form-control {
-  height: 30px;
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-.form-group-sm select.form-control {
-  height: 30px;
-  line-height: 30px;
-}
-.form-group-sm textarea.form-control,
-.form-group-sm select[multiple].form-control {
-  height: auto;
-}
-.form-group-sm .form-control-static {
-  height: 30px;
-  min-height: 32px;
-  padding: 6px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-}
-.input-lg {
-  height: 46px;
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-  border-radius: 6px;
-}
-select.input-lg {
-  height: 46px;
-  line-height: 46px;
-}
-textarea.input-lg,
-select[multiple].input-lg {
-  height: auto;
-}
-.form-group-lg .form-control {
-  height: 46px;
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-  border-radius: 6px;
-}
-.form-group-lg select.form-control {
-  height: 46px;
-  line-height: 46px;
-}
-.form-group-lg textarea.form-control,
-.form-group-lg select[multiple].form-control {
-  height: auto;
-}
-.form-group-lg .form-control-static {
-  height: 46px;
-  min-height: 38px;
-  padding: 11px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-}
-.has-feedback {
-  position: relative;
-}
-.has-feedback .form-control {
-  padding-right: 42.5px;
-}
-.form-control-feedback {
-  position: absolute;
-  top: 0;
-  right: 0;
-  z-index: 2;
-  display: block;
-  width: 34px;
-  height: 34px;
-  line-height: 34px;
-  text-align: center;
-  pointer-events: none;
-}
-.input-lg + .form-control-feedback,
-.input-group-lg + .form-control-feedback,
-.form-group-lg .form-control + .form-control-feedback {
-  width: 46px;
-  height: 46px;
-  line-height: 46px;
-}
-.input-sm + .form-control-feedback,
-.input-group-sm + .form-control-feedback,
-.form-group-sm .form-control + .form-control-feedback {
-  width: 30px;
-  height: 30px;
-  line-height: 30px;
-}
-.has-success .help-block,
-.has-success .control-label,
-.has-success .radio,
-.has-success .checkbox,
-.has-success .radio-inline,
-.has-success .checkbox-inline,
-.has-success.radio label,
-.has-success.checkbox label,
-.has-success.radio-inline label,
-.has-success.checkbox-inline label {
-  color: #3c763d;
-}
-.has-success .form-control {
-  border-color: #3c763d;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.has-success .form-control:focus {
-  border-color: #2b542c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
-}
-.has-success .input-group-addon {
-  color: #3c763d;
-  border-color: #3c763d;
-  background-color: #dff0d8;
-}
-.has-success .form-control-feedback {
-  color: #3c763d;
-}
-.has-warning .help-block,
-.has-warning .control-label,
-.has-warning .radio,
-.has-warning .checkbox,
-.has-warning .radio-inline,
-.has-warning .checkbox-inline,
-.has-warning.radio label,
-.has-warning.checkbox label,
-.has-warning.radio-inline label,
-.has-warning.checkbox-inline label {
-  color: #8a6d3b;
-}
-.has-warning .form-control {
-  border-color: #8a6d3b;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.has-warning .form-control:focus {
-  border-color: #66512c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
-}
-.has-warning .input-group-addon {
-  color: #8a6d3b;
-  border-color: #8a6d3b;
-  background-color: #fcf8e3;
-}
-.has-warning .form-control-feedback {
-  color: #8a6d3b;
-}
-.has-error .help-block,
-.has-error .control-label,
-.has-error .radio,
-.has-error .checkbox,
-.has-error .radio-inline,
-.has-error .checkbox-inline,
-.has-error.radio label,
-.has-error.checkbox label,
-.has-error.radio-inline label,
-.has-error.checkbox-inline label {
-  color: #a94442;
-}
-.has-error .form-control {
-  border-color: #a94442;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.has-error .form-control:focus {
-  border-color: #843534;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
-}
-.has-error .input-group-addon {
-  color: #a94442;
-  border-color: #a94442;
-  background-color: #f2dede;
-}
-.has-error .form-control-feedback {
-  color: #a94442;
-}
-.has-feedback label ~ .form-control-feedback {
-  top: 25px;
-}
-.has-feedback label.sr-only ~ .form-control-feedback {
-  top: 0;
-}
-.help-block {
-  display: block;
-  margin-top: 5px;
-  margin-bottom: 10px;
-  color: #737373;
-}
-@media (min-width: 768px) {
-  .form-inline .form-group {
-    display: inline-block;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .form-control {
-    display: inline-block;
-    width: auto;
-    vertical-align: middle;
-  }
-  .form-inline .form-control-static {
-    display: inline-block;
-  }
-  .form-inline .input-group {
-    display: inline-table;
-    vertical-align: middle;
-  }
-  .form-inline .input-group .input-group-addon,
-  .form-inline .input-group .input-group-btn,
-  .form-inline .input-group .form-control {
-    width: auto;
-  }
-  .form-inline .input-group > .form-control {
-    width: 100%;
-  }
-  .form-inline .control-label {
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .radio,
-  .form-inline .checkbox {
-    display: inline-block;
-    margin-top: 0;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .radio label,
-  .form-inline .checkbox label {
-    padding-left: 0;
-  }
-  .form-inline .radio input[type="radio"],
-  .form-inline .checkbox input[type="checkbox"] {
-    position: relative;
-    margin-left: 0;
-  }
-  .form-inline .has-feedback .form-control-feedback {
-    top: 0;
-  }
-}
-.form-horizontal .radio,
-.form-horizontal .checkbox,
-.form-horizontal .radio-inline,
-.form-horizontal .checkbox-inline {
-  margin-top: 0;
-  margin-bottom: 0;
-  padding-top: 7px;
-}
-.form-horizontal .radio,
-.form-horizontal .checkbox {
-  min-height: 27px;
-}
-.form-horizontal .form-group {
-  margin-left: -15px;
-  margin-right: -15px;
-}
-@media (min-width: 768px) {
-  .form-horizontal .control-label {
-    text-align: right;
-    margin-bottom: 0;
-    padding-top: 7px;
-  }
-}
-.form-horizontal .has-feedback .form-control-feedback {
-  right: 15px;
-}
-@media (min-width: 768px) {
-  .form-horizontal .form-group-lg .control-label {
-    padding-top: 14.333333px;
-    font-size: 18px;
-  }
-}
-@media (min-width: 768px) {
-  .form-horizontal .form-group-sm .control-label {
-    padding-top: 6px;
-    font-size: 12px;
-  }
-}
-.btn {
-  display: inline-block;
-  margin-bottom: 0;
-  font-weight: normal;
-  text-align: center;
-  vertical-align: middle;
-  touch-action: manipulation;
-  cursor: pointer;
-  background-image: none;
-  border: 1px solid transparent;
-  white-space: nowrap;
-  padding: 6px 12px;
-  font-size: 14px;
-  line-height: 1.42857143;
-  border-radius: 4px;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.btn:focus,
-.btn:active:focus,
-.btn.active:focus,
-.btn.focus,
-.btn:active.focus,
-.btn.active.focus {
-  outline: thin dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-.btn:hover,
-.btn:focus,
-.btn.focus {
-  color: #333333;
-  text-decoration: none;
-}
-.btn:active,
-.btn.active {
-  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,
-.btn[disabled],
-fieldset[disabled] .btn {
-  cursor: not-allowed;
-  opacity: 0.65;
-  filter: alpha(opacity=65);
-  -webkit-box-shadow: none;
-  box-shadow: none;
-}
-a.btn.disabled,
-fieldset[disabled] a.btn {
-  pointer-events: none;
-}
-.btn-default {
-  color: #333333;
-  background-color: #ffffff;
-  border-color: #cccccc;
-}
-.btn-default:focus,
-.btn-default.focus {
-  color: #333333;
-  background-color: #e6e6e6;
-  border-color: #8c8c8c;
-}
-.btn-default:hover {
-  color: #333333;
-  background-color: #e6e6e6;
-  border-color: #adadad;
-}
-.btn-default:active,
-.btn-default.active,
-.open > .dropdown-toggle.btn-default {
-  color: #333333;
-  background-color: #e6e6e6;
-  border-color: #adadad;
-}
-.btn-default:active:hover,
-.btn-default.active:hover,
-.open > .dropdown-toggle.btn-default:hover,
-.btn-default:active:focus,
-.btn-default.active:focus,
-.open > .dropdown-toggle.btn-default:focus,
-.btn-default:active.focus,
-.btn-default.active.focus,
-.open > .dropdown-toggle.btn-default.focus {
-  color: #333333;
-  background-color: #d4d4d4;
-  border-color: #8c8c8c;
-}
-.btn-default:active,
-.btn-default.active,
-.open > .dropdown-toggle.btn-default {
-  background-image: none;
-}
-.btn-default.disabled,
-.btn-default[disabled],
-fieldset[disabled] .btn-default,
-.btn-default.disabled:hover,
-.btn-default[disabled]:hover,
-fieldset[disabled] .btn-default:hover,
-.btn-default.disabled:focus,
-.btn-default[disabled]:focus,
-fieldset[disabled] .btn-default:focus,
-.btn-default.disabled.focus,
-.btn-default[disabled].focus,
-fieldset[disabled] .btn-default.focus,
-.btn-default.disabled:active,
-.btn-default[disabled]:active,
-fieldset[disabled] .btn-default:active,
-.btn-default.disabled.active,
-.btn-default[disabled].active,
-fieldset[disabled] .btn-default.active {
-  background-color: #ffffff;
-  border-color: #cccccc;
-}
-.btn-default .badge {
-  color: #ffffff;
-  background-color: #333333;
-}
-.btn-primary {
-  color: #ffffff;
-  background-color: #337ab7;
-  border-color: #2e6da4;
-}
-.btn-primary:focus,
-.btn-primary.focus {
-  color: #ffffff;
-  background-color: #286090;
-  border-color: #122b40;
-}
-.btn-primary:hover {
-  color: #ffffff;
-  background-color: #286090;
-  border-color: #204d74;
-}
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
-  color: #ffffff;
-  background-color: #286090;
-  border-color: #204d74;
-}
-.btn-primary:active:hover,
-.btn-primary.active:hover,
-.open > .dropdown-toggle.btn-primary:hover,
-.btn-primary:active:focus,
-.btn-primary.active:focus,
-.open > .dropdown-toggle.btn-primary:focus,
-.btn-primary:active.focus,
-.btn-primary.active.focus,
-.open > .dropdown-toggle.btn-primary.focus {
-  color: #ffffff;
-  background-color: #204d74;
-  border-color: #122b40;
-}
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
-  background-image: none;
-}
-.btn-primary.disabled,
-.btn-primary[disabled],
-fieldset[disabled] .btn-primary,
-.btn-primary.disabled:hover,
-.btn-primary[disabled]:hover,
-fieldset[disabled] .btn-primary:hover,
-.btn-primary.disabled:focus,
-.btn-primary[disabled]:focus,
-fieldset[disabled] .btn-primary:focus,
-.btn-primary.disabled.focus,
-.btn-primary[disabled].focus,
-fieldset[disabled] .btn-primary.focus,
-.btn-primary.disabled:active,
-.btn-primary[disabled]:active,
-fieldset[disabled] .btn-primary:active,
-.btn-primary.disabled.active,
-.btn-primary[disabled].active,
-fieldset[disabled] .btn-primary.active {
-  background-color: #337ab7;
-  border-color: #2e6da4;
-}
-.btn-primary .badge {
-  color: #337ab7;
-  background-color: #ffffff;
-}
-.btn-success {
-  color: #ffffff;
-  background-color: #5cb85c;
-  border-color: #4cae4c;
-}
-.btn-success:focus,
-.btn-success.focus {
-  color: #ffffff;
-  background-color: #449d44;
-  border-color: #255625;
-}
-.btn-success:hover {
-  color: #ffffff;
-  background-color: #449d44;
-  border-color: #398439;
-}
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
-  color: #ffffff;
-  background-color: #449d44;
-  border-color: #398439;
-}
-.btn-success:active:hover,
-.btn-success.active:hover,
-.open > .dropdown-toggle.btn-success:hover,
-.btn-success:active:focus,
-.btn-success.active:focus,
-.open > .dropdown-toggle.btn-success:focus,
-.btn-success:active.focus,
-.btn-success.active.focus,
-.open > .dropdown-toggle.btn-success.focus {
-  color: #ffffff;
-  background-color: #398439;
-  border-color: #255625;
-}
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
-  background-image: none;
-}
-.btn-success.disabled,
-.btn-success[disabled],
-fieldset[disabled] .btn-success,
-.btn-success.disabled:hover,
-.btn-success[disabled]:hover,
-fieldset[disabled] .btn-success:hover,
-.btn-success.disabled:focus,
-.btn-success[disabled]:focus,
-fieldset[disabled] .btn-success:focus,
-.btn-success.disabled.focus,
-.btn-success[disabled].focus,
-fieldset[disabled] .btn-success.focus,
-.btn-success.disabled:active,
-.btn-success[disabled]:active,
-fieldset[disabled] .btn-success:active,
-.btn-success.disabled.active,
-.btn-success[disabled].active,
-fieldset[disabled] .btn-success.active {
-  background-color: #5cb85c;
-  border-color: #4cae4c;
-}
-.btn-success .badge {
-  color: #5cb85c;
-  background-color: #ffffff;
-}
-.btn-info {
-  color: #ffffff;
-  background-color: #5bc0de;
-  border-color: #46b8da;
-}
-.btn-info:focus,
-.btn-info.focus {
-  color: #ffffff;
-  background-color: #31b0d5;
-  border-color: #1b6d85;
-}
-.btn-info:hover {
-  color: #ffffff;
-  background-color: #31b0d5;
-  border-color: #269abc;
-}
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
-  color: #ffffff;
-  background-color: #31b0d5;
-  border-color: #269abc;
-}
-.btn-info:active:hover,
-.btn-info.active:hover,
-.open > .dropdown-toggle.btn-info:hover,
-.btn-info:active:focus,
-.btn-info.active:focus,
-.open > .dropdown-toggle.btn-info:focus,
-.btn-info:active.focus,
-.btn-info.active.focus,
-.open > .dropdown-toggle.btn-info.focus {
-  color: #ffffff;
-  background-color: #269abc;
-  border-color: #1b6d85;
-}
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
-  background-image: none;
-}
-.btn-info.disabled,
-.btn-info[disabled],
-fieldset[disabled] .btn-info,
-.btn-info.disabled:hover,
-.btn-info[disabled]:hover,
-fieldset[disabled] .btn-info:hover,
-.btn-info.disabled:focus,
-.btn-info[disabled]:focus,
-fieldset[disabled] .btn-info:focus,
-.btn-info.disabled.focus,
-.btn-info[disabled].focus,
-fieldset[disabled] .btn-info.focus,
-.btn-info.disabled:active,
-.btn-info[disabled]:active,
-fieldset[disabled] .btn-info:active,
-.btn-info.disabled.active,
-.btn-info[disabled].active,
-fieldset[disabled] .btn-info.active {
-  background-color: #5bc0de;
-  border-color: #46b8da;
-}
-.btn-info .badge {
-  color: #5bc0de;
-  background-color: #ffffff;
-}
-.btn-warning {
-  color: #ffffff;
-  background-color: #f0ad4e;
-  border-color: #eea236;
-}
-.btn-warning:focus,
-.btn-warning.focus {
-  color: #ffffff;
-  background-color: #ec971f;
-  border-color: #985f0d;
-}
-.btn-warning:hover {
-  color: #ffffff;
-  background-color: #ec971f;
-  border-color: #d58512;
-}
-.btn-warning:active,
-.btn-warning.active,
-.open > .dropdown-toggle.btn-warning {
-  color: #ffffff;
-  background-color: #ec971f;
-  border-color: #d58512;
-}
-.btn-warning:active:hover,
-.btn-warning.active:hover,
-.open > .dropdown-toggle.btn-warning:hover,
-.btn-warning:active:focus,
-.btn-warning.active:focus,
-.open > .dropdown-toggle.btn-warning:focus,
-.btn-warning:active.focus,
-.btn-warning.active.focus,
-.open > .dropdown-toggle.btn-warning.focus {
-  color: #ffffff;
-  background-color: #d58512;
-  border-color: #985f0d;
-}
-.btn-warning:active,
-.btn-warning.active,
-.open > .dropdown-toggle.btn-warning {
-  background-image: none;
-}
-.btn-warning.disabled,
-.btn-warning[disabled],
-fieldset[disabled] .btn-warning,
-.btn-warning.disabled:hover,
-.btn-warning[disabled]:hover,
-fieldset[disabled] .btn-warning:hover,
-.btn-warning.disabled:focus,
-.btn-warning[disabled]:focus,
-fieldset[disabled] .btn-warning:focus,
-.btn-warning.disabled.focus,
-.btn-warning[disabled].focus,
-fieldset[disabled] .btn-warning.focus,
-.btn-warning.disabled:active,
-.btn-warning[disabled]:active,
-fieldset[disabled] .btn-warning:active,
-.btn-warning.disabled.active,
-.btn-warning[disabled].active,
-fieldset[disabled] .btn-warning.active {
-  background-color: #f0ad4e;
-  border-color: #eea236;
-}
-.btn-warning .badge {
-  color: #f0ad4e;
-  background-color: #ffffff;
-}
-.btn-danger {
-  color: #ffffff;
-  background-color: #d9534f;
-  border-color: #d43f3a;
-}
-.btn-danger:focus,
-.btn-danger.focus {
-  color: #ffffff;
-  background-color: #c9302c;
-  border-color: #761c19;
-}
-.btn-danger:hover {
-  color: #ffffff;
-  background-color: #c9302c;
-  border-color: #ac2925;
-}
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
-  color: #ffffff;
-  background-color: #c9302c;
-  border-color: #ac2925;
-}
-.btn-danger:active:hover,
-.btn-danger.active:hover,
-.open > .dropdown-toggle.btn-danger:hover,
-.btn-danger:active:focus,
-.btn-danger.active:focus,
-.open > .dropdown-toggle.btn-danger:focus,
-.btn-danger:active.focus,
-.btn-danger.active.focus,
-.open > .dropdown-toggle.btn-danger.focus {
-  color: #ffffff;
-  background-color: #ac2925;
-  border-color: #761c19;
-}
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
-  background-image: none;
-}
-.btn-danger.disabled,
-.btn-danger[disabled],
-fieldset[disabled] .btn-danger,
-.btn-danger.disabled:hover,
-.btn-danger[disabled]:hover,
-fieldset[disabled] .btn-danger:hover,
-.btn-danger.disabled:focus,
-.btn-danger[disabled]:focus,
-fieldset[disabled] .btn-danger:focus,
-.btn-danger.disabled.focus,
-.btn-danger[disabled].focus,
-fieldset[disabled] .btn-danger.focus,
-.btn-danger.disabled:active,
-.btn-danger[disabled]:active,
-fieldset[disabled] .btn-danger:active,
-.btn-danger.disabled.active,
-.btn-danger[disabled].active,
-fieldset[disabled] .btn-danger.active {
-  background-color: #d9534f;
-  border-color: #d43f3a;
-}
-.btn-danger .badge {
-  color: #d9534f;
-  background-color: #ffffff;
-}
-.btn-link {
-  color: #337ab7;
-  font-weight: normal;
-  border-radius: 0;
-}
-.btn-link,
-.btn-link:active,
-.btn-link.active,
-.btn-link[disabled],
-fieldset[disabled] .btn-link {
-  background-color: transparent;
-  -webkit-box-shadow: none;
-  box-shadow: none;
-}
-.btn-link,
-.btn-link:hover,
-.btn-link:focus,
-.btn-link:active {
-  border-color: transparent;
-}
-.btn-link:hover,
-.btn-link:focus {
-  color: #23527c;
-  text-decoration: underline;
-  background-color: transparent;
-}
-.btn-link[disabled]:hover,
-fieldset[disabled] .btn-link:hover,
-.btn-link[disabled]:focus,
-fieldset[disabled] .btn-link:focus {
-  color: #777777;
-  text-decoration: none;
-}
-.btn-lg {
-  padding: 10px 16px;
-  font-size: 18px;
-  line-height: 1.3333333;
-  border-radius: 6px;
-}
-.btn-sm {
-  padding: 5px 10px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-.btn-xs {
-  padding: 1px 5px;
-  font-size: 12px;
-  line-height: 1.5;
-  border-radius: 3px;
-}
-.btn-block {
-  display: block;
-  width: 100%;
-}
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
-  width: 100%;
-}
-.navbar {
-  position: relative;
-  min-height: 50px;
-  margin-bottom: 20px;
-  border: 1px solid transparent;
-}
-@media (min-width: 768px) {
-  .navbar {
-    border-radius: 4px;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-header {
-    float: left;
-  }
-}
-.navbar-collapse {
-  overflow-x: visible;
-  padding-right: 15px;
-  padding-left: 15px;
-  border-top: 1px solid transparent;
-  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
-  -webkit-overflow-scrolling: touch;
-}
-.navbar-collapse.in {
-  overflow-y: auto;
-}
-@media (min-width: 768px) {
-  .navbar-collapse {
-    width: auto;
-    border-top: 0;
-    box-shadow: none;
-  }
-  .navbar-collapse.collapse {
-    display: block !important;
-    height: auto !important;
-    padding-bottom: 0;
-    overflow: visible !important;
-  }
-  .navbar-collapse.in {
-    overflow-y: visible;
-  }
-  .navbar-fixed-top .navbar-collapse,
-  .navbar-static-top .navbar-collapse,
-  .navbar-fixed-bottom .navbar-collapse {
-    padding-left: 0;
-    padding-right: 0;
-  }
-}
-.navbar-fixed-top .navbar-collapse,
-.navbar-fixed-bottom .navbar-collapse {
-  max-height: 340px;
-}
-@media (max-device-width: 480px) and (orientation: landscape) {
-  .navbar-fixed-top .navbar-collapse,
-  .navbar-fixed-bottom .navbar-collapse {
-    max-height: 200px;
-  }
-}
-.container > .navbar-header,
-.container-fluid > .navbar-header,
-.container > .navbar-collapse,
-.container-fluid > .navbar-collapse {
-  margin-right: -15px;
-  margin-left: -15px;
-}
-@media (min-width: 768px) {
-  .container > .navbar-header,
-  .container-fluid > .navbar-header,
-  .container > .navbar-collapse,
-  .container-fluid > .navbar-collapse {
-    margin-right: 0;
-    margin-left: 0;
-  }
-}
-.navbar-static-top {
-  z-index: 1000;
-  border-width: 0 0 1px;
-}
-@media (min-width: 768px) {
-  .navbar-static-top {
-    border-radius: 0;
-  }
-}
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-}
-@media (min-width: 768px) {
-  .navbar-fixed-top,
-  .navbar-fixed-bottom {
-    border-radius: 0;
-  }
-}
-.navbar-fixed-top {
-  top: 0;
-  border-width: 0 0 1px;
-}
-.navbar-fixed-bottom {
-  bottom: 0;
-  margin-bottom: 0;
-  border-width: 1px 0 0;
-}
-.navbar-brand {
-  float: left;
-  padding: 15px 15px;
-  font-size: 18px;
-  line-height: 20px;
-  height: 50px;
-}
-.navbar-brand:hover,
-.navbar-brand:focus {
-  text-decoration: none;
-}
-.navbar-brand > img {
-  display: block;
-}
-@media (min-width: 768px) {
-  .navbar > .container .navbar-brand,
-  .navbar > .container-fluid .navbar-brand {
-    margin-left: -15px;
-  }
-}
-.navbar-toggle {
-  position: relative;
-  float: right;
-  margin-right: 15px;
-  padding: 9px 10px;
-  margin-top: 8px;
-  margin-bottom: 8px;
-  background-color: transparent;
-  background-image: none;
-  border: 1px solid transparent;
-  border-radius: 4px;
-}
-.navbar-toggle:focus {
-  outline: 0;
-}
-.navbar-toggle .icon-bar {
-  display: block;
-  width: 22px;
-  height: 2px;
-  border-radius: 1px;
-}
-.navbar-toggle .icon-bar + .icon-bar {
-  margin-top: 4px;
-}
-@media (min-width: 768px) {
-  .navbar-toggle {
-    display: none;
-  }
-}
-.navbar-nav {
-  margin: 7.5px -15px;
-}
-.navbar-nav > li > a {
-  padding-top: 10px;
-  padding-bottom: 10px;
-  line-height: 20px;
-}
-@media (max-width: 767px) {
-  .navbar-nav .open .dropdown-menu {
-    position: static;
-    float: none;
-    width: auto;
-    margin-top: 0;
-    background-color: transparent;
-    border: 0;
-    box-shadow: none;
-  }
-  .navbar-nav .open .dropdown-menu > li > a,
-  .navbar-nav .open .dropdown-menu .dropdown-header {
-    padding: 5px 15px 5px 25px;
-  }
-  .navbar-nav .open .dropdown-menu > li > a {
-    line-height: 20px;
-  }
-  .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-nav .open .dropdown-menu > li > a:focus {
-    background-image: none;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-nav {
-    float: left;
-    margin: 0;
-  }
-  .navbar-nav > li {
-    float: left;
-  }
-  .navbar-nav > li > a {
-    padding-top: 15px;
-    padding-bottom: 15px;
-  }
-}
-.navbar-form {
-  margin-left: -15px;
-  margin-right: -15px;
-  padding: 10px 15px;
-  border-top: 1px solid transparent;
-  border-bottom: 1px solid transparent;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
-  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
-  margin-top: 8px;
-  margin-bottom: 8px;
-}
-@media (min-width: 768px) {
-  .navbar-form .form-group {
-    display: inline-block;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .form-control {
-    display: inline-block;
-    width: auto;
-    vertical-align: middle;
-  }
-  .navbar-form .form-control-static {
-    display: inline-block;
-  }
-  .navbar-form .input-group {
-    display: inline-table;
-    vertical-align: middle;
-  }
-  .navbar-form .input-group .input-group-addon,
-  .navbar-form .input-group .input-group-btn,
-  .navbar-form .input-group .form-control {
-    width: auto;
-  }
-  .navbar-form .input-group > .form-control {
-    width: 100%;
-  }
-  .navbar-form .control-label {
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .radio,
-  .navbar-form .checkbox {
-    display: inline-block;
-    margin-top: 0;
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .navbar-form .radio label,
-  .navbar-form .checkbox label {
-    padding-left: 0;
-  }
-  .navbar-form .radio input[type="radio"],
-  .navbar-form .checkbox input[type="checkbox"] {
-    position: relative;
-    margin-left: 0;
-  }
-  .navbar-form .has-feedback .form-control-feedback {
-    top: 0;
-  }
-}
-@media (max-width: 767px) {
-  .navbar-form .form-group {
-    margin-bottom: 5px;
-  }
-  .navbar-form .form-group:last-child {
-    margin-bottom: 0;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-form {
-    width: auto;
-    border: 0;
-    margin-left: 0;
-    margin-right: 0;
-    padding-top: 0;
-    padding-bottom: 0;
-    -webkit-box-shadow: none;
-    box-shadow: none;
-  }
-}
-.navbar-nav > li > .dropdown-menu {
-  margin-top: 0;
-  border-top-right-radius: 0;
-  border-top-left-radius: 0;
-}
-.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
-  margin-bottom: 0;
-  border-top-right-radius: 4px;
-  border-top-left-radius: 4px;
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-}
-.navbar-btn {
-  margin-top: 8px;
-  margin-bottom: 8px;
-}
-.navbar-btn.btn-sm {
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-.navbar-btn.btn-xs {
-  margin-top: 14px;
-  margin-bottom: 14px;
-}
-.navbar-text {
-  margin-top: 15px;
-  margin-bottom: 15px;
-}
-@media (min-width: 768px) {
-  .navbar-text {
-    float: left;
-    margin-left: 15px;
-    margin-right: 15px;
-  }
-}
-@media (min-width: 768px) {
-  .navbar-left {
-    float: left !important;
-  }
-  .navbar-right {
-    float: right !important;
-    margin-right: -15px;
-  }
-  .navbar-right ~ .navbar-right {
-    margin-right: 0;
-  }
-}
-.navbar-default {
-  background-color: #f8f8f8;
-  border-color: #e7e7e7;
-}
-.navbar-default .navbar-brand {
-  color: #777777;
-}
-.navbar-default .navbar-brand:hover,
-.navbar-default .navbar-brand:focus {
-  color: #5e5e5e;
-  background-color: transparent;
-}
-.navbar-default .navbar-text {
-  color: #777777;
-}
-.navbar-default .navbar-nav > li > a {
-  color: #777777;
-}
-.navbar-default .navbar-nav > li > a:hover,
-.navbar-default .navbar-nav > li > a:focus {
-  color: #333333;
-  background-color: transparent;
-}
-.navbar-default .navbar-nav > .active > a,
-.navbar-default .navbar-nav > .active > a:hover,
-.navbar-default .navbar-nav > .active > a:focus {
-  color: #555555;
-  background-color: #e7e7e7;
-}
-.navbar-default .navbar-nav > .disabled > a,
-.navbar-default .navbar-nav > .disabled > a:hover,
-.navbar-default .navbar-nav > .disabled > a:focus {
-  color: #cccccc;
-  background-color: transparent;
-}
-.navbar-default .navbar-toggle {
-  border-color: #dddddd;
-}
-.navbar-default .navbar-toggle:hover,
-.navbar-default .navbar-toggle:focus {
-  background-color: #dddddd;
-}
-.navbar-default .navbar-toggle .icon-bar {
-  background-color: #888888;
-}
-.navbar-default .navbar-collapse,
-.navbar-default .navbar-form {
-  border-color: #e7e7e7;
-}
-.navbar-default .navbar-nav > .open > a,
-.navbar-default .navbar-nav > .open > a:hover,
-.navbar-default .navbar-nav > .open > a:focus {
-  background-color: #e7e7e7;
-  color: #555555;
-}
-@media (max-width: 767px) {
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
-    color: #777777;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
-    color: #333333;
-    background-color: transparent;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
-    color: #555555;
-    background-color: #e7e7e7;
-  }
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
-  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
-    color: #cccccc;
-    background-color: transparent;
-  }
-}
-.navbar-default .navbar-link {
-  color: #777777;
-}
-.navbar-default .navbar-link:hover {
-  color: #333333;
-}
-.navbar-default .btn-link {
-  color: #777777;
-}
-.navbar-default .btn-link:hover,
-.navbar-default .btn-link:focus {
-  color: #333333;
-}
-.navbar-default .btn-link[disabled]:hover,
-fieldset[disabled] .navbar-default .btn-link:hover,
-.navbar-default .btn-link[disabled]:focus,
-fieldset[disabled] .navbar-default .btn-link:focus {
-  color: #cccccc;
-}
-.navbar-inverse {
-  background-color: #222222;
-  border-color: #080808;
-}
-.navbar-inverse .navbar-brand {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-brand:hover,
-.navbar-inverse .navbar-brand:focus {
-  color: #ffffff;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-text {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-nav > li > a {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-nav > li > a:hover,
-.navbar-inverse .navbar-nav > li > a:focus {
-  color: #ffffff;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-nav > .active > a,
-.navbar-inverse .navbar-nav > .active > a:hover,
-.navbar-inverse .navbar-nav > .active > a:focus {
-  color: #ffffff;
-  background-color: #080808;
-}
-.navbar-inverse .navbar-nav > .disabled > a,
-.navbar-inverse .navbar-nav > .disabled > a:hover,
-.navbar-inverse .navbar-nav > .disabled > a:focus {
-  color: #444444;
-  background-color: transparent;
-}
-.navbar-inverse .navbar-toggle {
-  border-color: #333333;
-}
-.navbar-inverse .navbar-toggle:hover,
-.navbar-inverse .navbar-toggle:focus {
-  background-color: #333333;
-}
-.navbar-inverse .navbar-toggle .icon-bar {
-  background-color: #ffffff;
-}
-.navbar-inverse .navbar-collapse,
-.navbar-inverse .navbar-form {
-  border-color: #101010;
-}
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .open > a:hover,
-.navbar-inverse .navbar-nav > .open > a:focus {
-  background-color: #080808;
-  color: #ffffff;
-}
-@media (max-width: 767px) {
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
-    border-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
-    background-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
-    color: #9d9d9d;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
-    color: #ffffff;
-    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: #ffffff;
-    background-color: #080808;
-  }
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
-  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
-    color: #444444;
-    background-color: transparent;
-  }
-}
-.navbar-inverse .navbar-link {
-  color: #9d9d9d;
-}
-.navbar-inverse .navbar-link:hover {
-  color: #ffffff;
-}
-.navbar-inverse .btn-link {
-  color: #9d9d9d;
-}
-.navbar-inverse .btn-link:hover,
-.navbar-inverse .btn-link:focus {
-  color: #ffffff;
-}
-.navbar-inverse .btn-link[disabled]:hover,
-fieldset[disabled] .navbar-inverse .btn-link:hover,
-.navbar-inverse .btn-link[disabled]:focus,
-fieldset[disabled] .navbar-inverse .btn-link:focus {
-  color: #444444;
-}
-.clearfix:before,
-.clearfix:after,
-.dl-horizontal dd:before,
-.dl-horizontal dd:after,
-.container:before,
-.container:after,
-.container-fluid:before,
-.container-fluid:after,
-.row:before,
-.row:after,
-.form-horizontal .form-group:before,
-.form-horizontal .form-group:after,
-.navbar:before,
-.navbar:after,
-.navbar-header:before,
-.navbar-header:after,
-.navbar-collapse:before,
-.navbar-collapse:after {
-  content: " ";
-  display: table;
-}
-.clearfix:after,
-.dl-horizontal dd:after,
-.container:after,
-.container-fluid:after,
-.row:after,
-.form-horizontal .form-group:after,
-.navbar:after,
-.navbar-header:after,
-.navbar-collapse:after {
-  clear: both;
-}
-.center-block {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
-.pull-right {
-  float: right !important;
-}
-.pull-left {
-  float: left !important;
-}
-.hide {
-  display: none !important;
-}
-.show {
-  display: block !important;
-}
-.invisible {
-  visibility: hidden;
-}
-.text-hide {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-.hidden {
-  display: none !important;
-}
-.affix {
-  position: fixed;
-}
-@-ms-viewport {
-  width: device-width;
-}
-.visible-xs,
-.visible-sm,
-.visible-md,
-.visible-lg {
-  display: none !important;
-}
-.visible-xs-block,
-.visible-xs-inline,
-.visible-xs-inline-block,
-.visible-sm-block,
-.visible-sm-inline,
-.visible-sm-inline-block,
-.visible-md-block,
-.visible-md-inline,
-.visible-md-inline-block,
-.visible-lg-block,
-.visible-lg-inline,
-.visible-lg-inline-block {
-  display: none !important;
-}
-@media (max-width: 767px) {
-  .visible-xs {
-    display: block !important;
-  }
-  table.visible-xs {
-    display: table !important;
-  }
-  tr.visible-xs {
-    display: table-row !important;
-  }
-  th.visible-xs,
-  td.visible-xs {
-    display: table-cell !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-block {
-    display: block !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-inline {
-    display: inline !important;
-  }
-}
-@media (max-width: 767px) {
-  .visible-xs-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm {
-    display: block !important;
-  }
-  table.visible-sm {
-    display: table !important;
-  }
-  tr.visible-sm {
-    display: table-row !important;
-  }
-  th.visible-sm,
-  td.visible-sm {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-block {
-    display: block !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .visible-sm-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md {
-    display: block !important;
-  }
-  table.visible-md {
-    display: table !important;
-  }
-  tr.visible-md {
-    display: table-row !important;
-  }
-  th.visible-md,
-  td.visible-md {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-block {
-    display: block !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .visible-md-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg {
-    display: block !important;
-  }
-  table.visible-lg {
-    display: table !important;
-  }
-  tr.visible-lg {
-    display: table-row !important;
-  }
-  th.visible-lg,
-  td.visible-lg {
-    display: table-cell !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-block {
-    display: block !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-inline {
-    display: inline !important;
-  }
-}
-@media (min-width: 1200px) {
-  .visible-lg-inline-block {
-    display: inline-block !important;
-  }
-}
-@media (max-width: 767px) {
-  .hidden-xs {
-    display: none !important;
-  }
-}
-@media (min-width: 768px) and (max-width: 991px) {
-  .hidden-sm {
-    display: none !important;
-  }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
-  .hidden-md {
-    display: none !important;
-  }
-}
-@media (min-width: 1200px) {
-  .hidden-lg {
-    display: none !important;
-  }
-}
-.visible-print {
-  display: none !important;
-}
-@media print {
-  .visible-print {
-    display: block !important;
-  }
-  table.visible-print {
-    display: table !important;
-  }
-  tr.visible-print {
-    display: table-row !important;
-  }
-  th.visible-print,
-  td.visible-print {
-    display: table-cell !important;
-  }
-}
-.visible-print-block {
-  display: none !important;
-}
-@media print {
-  .visible-print-block {
-    display: block !important;
-  }
-}
-.visible-print-inline {
-  display: none !important;
-}
-@media print {
-  .visible-print-inline {
-    display: inline !important;
-  }
-}
-.visible-print-inline-block {
-  display: none !important;
-}
-@media print {
-  .visible-print-inline-block {
-    display: inline-block !important;
-  }
-}
-@media print {
-  .hidden-print {
-    display: none !important;
-  }
-}
-.navbar .navbar-full .navbar-brand > * {
-  display: inline-block;
-}
-.navbar .navbar-full .navbar-brand img {
-  height: 16px;
-}
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */hr,img{border:0}body,figure{margin:0}.img-thumbnail,.table,label{max-width:100%}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size:10px;-webkit-tap-highlight-color:transparent}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}svg:not(:root){overflow:hidden}hr{box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-success,.open>.dropdown-toggle.btn-warning{background-image:none}.img-thumbnail,body{background-color:#fff}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}ol,ul{margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-bottom:20px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-left:15px;padding-right:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}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-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{margin:0;min-width:0}legend{display:block;width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.form-group-sm .form-control,.input-sm{padding:5px 10px;border-radius:3px;font-size:12px}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.nav>li,.nav>li>a,.navbar{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}.btn,.nav{margin-bottom:0}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.btn-block,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-xs{font-size:12px;line-height:1.5;border-radius:3px}.btn-sm{padding:5px 10px}.btn-xs{padding:1px 5px}.btn-block{display:block}.btn-block+.btn-block{margin-top:5px}.nav{padding-left:0;list-style:none}.nav>li{display:block}.nav>li>a{display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.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-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{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:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.row:after,.row:before{content:" ";display:table}.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.row: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}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.loader.sk-folding-cube{margin:80px auto;width:80px;height:80px;position:relative;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg)}.loader.sk-folding-cube .sk-cube{float:left;width:50%;height:50%;position:relative;-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}.loader.sk-folding-cube .sk-cube:before{content:'';position:absolute;top:0;left:0;width:100%;height:100%;background-color:#777;-webkit-animation:sk-foldCubeAngle 2.4s infinite linear both;animation:sk-foldCubeAngle 2.4s infinite linear both;-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%}.loader.sk-folding-cube .sk-cube2{-webkit-transform:scale(1.1) rotateZ(90deg);transform:scale(1.1) rotateZ(90deg)}.loader.sk-folding-cube .sk-cube3{-webkit-transform:scale(1.1) rotateZ(180deg);transform:scale(1.1) rotateZ(180deg)}.loader.sk-folding-cube .sk-cube4{-webkit-transform:scale(1.1) rotateZ(270deg);transform:scale(1.1) rotateZ(270deg)}.loader.sk-folding-cube .sk-cube2:before{-webkit-animation-delay:.3s;animation-delay:.3s}.loader.sk-folding-cube .sk-cube3:before{-webkit-animation-delay:.6s;animation-delay:.6s}.loader.sk-folding-cube .sk-cube4:before{-webkit-animation-delay:.9s;animation-delay:.9s}@-webkit-keyframes sk-foldCubeAngle{0%,10%{-webkit-transform:perspective(140px) rotateX(-180deg);transform:perspective(140px) rotateX(-180deg);opacity:0}25%,75%{-webkit-transform:perspective(140px) rotateX(0);transform:perspective(140px) rotateX(0);opacity:1}100%,90%{-webkit-transform:perspective(140px) rotateY(180deg);transform:perspective(140px) rotateY(180deg);opacity:0}}@keyframes sk-foldCubeAngle{0%,10%{-webkit-transform:perspective(140px) rotateX(-180deg);transform:perspective(140px) rotateX(-180deg);opacity:0}25%,75%{-webkit-transform:perspective(140px) rotateX(0);transform:perspective(140px) rotateX(0);opacity:1}100%,90%{-webkit-transform:perspective(140px) rotateY(180deg);transform:perspective(140px) rotateY(180deg);opacity:0}}.navbar .navbar-full .navbar-brand>*{display:inline-block}.navbar .navbar-full .navbar-brand img{height:16px}

+ 571 - 35
misago/static/misago/js/misago.js

@@ -55,7 +55,10 @@
     this.registerCoreServices = function() {
       this.addService('conf', ns.Conf);
       this.addService('router', ns.RouterFactory);
+      this.addService('api', ns.Api);
       this.addService('outlet', ns.Outlet);
+      this.addService('title', ns.PageTitle);
+      this.addService('start-routing', ns.startRouting);
     };
 
     // Component factory
@@ -65,17 +68,18 @@
         arguments_array.push(arguments[i]);
       }
 
-      if (arguments_array[arguments_array.length - 1] !== this) {
-        arguments_array.push(this);
-      }
-
+      arguments_array.push(this);
       return m.component.apply(undefined, arguments_array);
     };
 
-    // App ini/destory
-    this._outlet = null;
-    this.init = function(outlet) {
-      this._outlet = outlet || null;
+    // App init/destory
+    this.setup = false;
+    this.init = function(setup) {
+      this.setup = {
+        fixture: ns.get(setup, 'fixture', null),
+        in_test: ns.get(setup, 'in_test', false)
+      };
+
       this._initServices(this._services);
     };
 
@@ -85,13 +89,20 @@
   };
 }());
 
+
 (function (ns) {
   'use strict';
 
+  var persistent = function(el, isInit, context) {
+    context.retain = true;
+  };
+
   ns.ForumLayout = {
     view: function(ctrl, _) {
       return [
-        _.component(ns.ForumNavbar)
+        _.component(ns.ForumNavbar),
+        m('#router-fixture', {config: persistent}),
+        _.component(ns.ForumFooter)
       ];
     }
   };
@@ -100,22 +111,261 @@
 (function (ns) {
   'use strict';
 
+  var self = {
+    controller: function() {
+      var _ = self.container;
+      _.setTitle(_.settings.forum_index_title);
+    },
+    view: function() {
+      return m('.container', [
+        m('h1', 'Forum index page!'),
+        m('p', 'Lorem ipsum dolor met sit amet elit.'),
+        m('p', 'Sequar elit dolor nihi putto.')
+      ]);
+    }
+  };
+  ns.IndexPage = self;
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  var legalPageFactory = function(type_name, default_title) {
+    var dashed_type_name = type_name.replace(/_/g, '-');
+
+    var self = {
+      is_destroyed: true,
+      controller: function() {
+        self.is_destroyed = false;
+        self.vm.init();
+
+        return {
+          onunload: function() {
+            self.is_destroyed = true;
+          }
+        };
+      },
+      vm: {
+        is_busy: false,
+        is_ready: false,
+        content: null,
+
+        init: function() {
+          var _ = self.container;
+
+          var vm = this;
+          if (vm.is_ready) {
+            _.setTitle(vm.title);
+          } else {
+            _.setTitle();
+
+            if (!vm.is_busy) {
+              vm.is_busy = true;
+
+              _.api.one('legal-pages', dashed_type_name).then(function(data) {
+                vm.title = data.title || default_title;
+                vm.body = data.body;
+                vm.is_busy = false;
+                vm.is_ready = true;
+
+                if (!self.is_destroyed) {
+                  _.setTitle(vm.title);
+                  m.redraw();
+                }
+              });
+            }
+          }
+        }
+      },
+      view: function() {
+        var _ = this.container;
+
+        if (this.vm.is_ready) {
+          return m('.page.page-legal.page-legal-' + dashed_type_name, [
+            _.component(ns.PageHeader, {title: this.vm.title}),
+            m('.container',
+              m.trust(this.vm.body)
+            )
+          ]);
+        } else {
+          return _.component(ns.LoadingPage);
+        }
+      }
+    };
+    return self;
+  };
+
+  ns.TermsOfServicePage = legalPageFactory(
+    'terms_of_service', gettext('Terms of service'));
+  ns.PrivacyPolicyPage = legalPageFactory(
+    'privacy_policy', gettext('Privacy policy'));
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  ns.Loader = {
+    view: function() {
+      return m('.loader.sk-folding-cube', [
+        m('.sk-cube1.sk-cube'),
+        m('.sk-cube2.sk-cube'),
+        m('.sk-cube4.sk-cube'),
+        m('.sk-cube3.sk-cube')
+      ]);
+    }
+  };
+
+  ns.LoadingPage = {
+    view: function(ctrl, _) {
+      return m('.page.page-loading',
+        _.component(ns.Loader)
+      );
+    }
+  };
+} (Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  var setupMarkup = function(el, isInit, context) {
+    context.retain = true;
+  };
+
+  ns.MisagoMarkup = {
+    view: function(ctrl, content) {
+      return m('article.misago-markup', {config: setupMarkup}, m.trust(content));
+    }
+  };
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  ns.PageHeader = {
+    view: function(ctrl, options) {
+      return m('.page-header',
+        m('.container', [
+          m('h1', options.title),
+        ])
+      );
+    }
+  };
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  var legalLink = function(_, legal_type, default_title) {
+    var url = ns.get(_.settings, legal_type + '_link');
+    if (!url && ns.get(_.settings, legal_type)) {
+      url = _.router.url(legal_type);
+    }
+
+    if (url) {
+      return m('li',
+        m('a', {href: url}, ns.get(_.settings, legal_type + '_title', default_title))
+      );
+    } else {
+      return null;
+    }
+  };
+
+  ns.FooterNav = {
+    isVisible: function(settings) {
+      return [
+        !!settings.forum_footnote,
+        !!settings.terms_of_service,
+        !!settings.terms_of_service_link,
+        !!settings.privacy_policy,
+        !!settings.privacy_policy_link
+      ].indexOf(true) !== -1;
+    },
+    view: function(ctrl, _) {
+      var items = [];
+
+      if (_.settings.forum_footnote) {
+        items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));
+      }
+
+      items.push(legalLink(_, 'terms_of_service', gettext('Terms of service')));
+      items.push(legalLink(_, 'privacy_policy', gettext('Privacy policy')));
+
+      return m('ul.list-inline.footer-nav', items);
+    }
+  };
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  ns.ForumFooter = {
+    view: function(ctrl, _) {
+      var nav = null;
+      if (ns.FooterNav.isVisible(_.settings)) {
+        nav = _.component(ns.FooterNav);
+      }
+
+      return m('footer.forum-footer', [
+        m('.container',
+          m('.footer-content', [
+            nav,
+            _.component(ns.FooterMisagoBranding)
+          ])
+        )
+      ]);
+    }
+  };
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  ns.FooterMisagoBranding = {
+    view: function() {
+      return m('a.misago-branding[href=http://misago-project.org]', [
+        "powered by ", m('strong', "misago")
+      ]);
+    }
+  };
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  ns.BrandFull = {
+    view: function(ctrl, branding, _) {
+      var children = [
+        m('img', {
+          src: _.router.staticUrl('misago/img/site-logo.png'),
+          alt: _.settings.forum_name
+        })
+      ];
+
+      if (branding) {
+        children.push(branding);
+      }
+
+      return m('a.navbar-brand', {href: _.router.url('index')}, children);
+    }
+  };
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
   ns.ForumNavbar = {
     view: function(ctrl, _) {
       var desktop_navbar = [];
 
       if (_.settings.forum_branding_display) {
-        desktop_navbar.push(
-          m('a.navbar-brand', {href: _.router.url('misago:index')}, [
-            m('img', {
-              src: _.router.staticUrl('misago/img/site-logo.png'),
-              alt: _.settings.forum_name
-            }),
-            _.settings.forum_branding_text
-          ])
-        );
+        desktop_navbar.push(_.component(ns.BrandFull, _.settings.forum_branding_text));
       }
 
+      desktop_navbar.push(m('ul.nav.navbar-nav', [
+        m('li', m("a", {config: m.route, href: _.router.url('index')}, 'Index')),
+        m('li', m("a", {config: m.route, href: _.router.url('test')}, 'Test'))
+      ]));
+
       return m('nav.navbar.navbar-default.navbar-static-top[role="navigation"]', [
         m('.container.navbar-full.hidden-xs.hidden-sm', desktop_navbar)
       ]);
@@ -126,8 +376,86 @@
 (function (ns) {
   'use strict';
 
+  var Api = function(_) {
+    // Ajax implementation
+    var cookie_regex = new RegExp(_.preloaded_data.CSRF_COOKIE_NAME + '\=([^;]*)');
+    this.csrf_token = ns.get(document.cookie.match(cookie_regex), 0).split('=')[1];
+
+    this.ajax = function(method, url, data, progress) {
+      var deferred = m.deferred();
+
+      var ajax_settings = {
+        url: url,
+        method: method,
+        headers: {
+          'X-CSRFToken': this.csrf_token
+        },
+
+        data: data | {},
+        dataType: 'json',
+
+        success: function(data) {
+          deferred.resolve(data);
+        },
+        error: function(jqXHR) {
+          deferred.reject(jqXHR);
+        }
+      };
+
+      if (progress) {
+        return; // not implemented... yet!
+      }
+
+      $.ajax(ajax_settings);
+      return deferred.promise;
+    };
+
+    this.get = function(url) {
+      var preloaded_data = ns.pop(_.preloaded_data, url);
+      if (preloaded_data) {
+        var deferred = m.deferred();
+        deferred.resolve(preloaded_data);
+        return deferred.promise;
+      } else {
+        return this.ajax('GET', url);
+      }
+    };
+
+    this.post = function(url) {
+      return this.ajax('POST', url);
+    };
+
+    // API
+    this.buildUrl = function(model, call, querystrings) {
+      var url = _.router.base_url;
+      url += 'api/' + model + '/';
+      return url;
+    };
+
+    this.one = function(model, id) {
+      var url = this.buildUrl(model) + id + '/';
+      return this.get(url);
+    };
+
+    this.many = function(model, filters) {
+
+    };
+
+    this.call = function(model, call, target, data) {
+
+    };
+  };
+
+  ns.Api = function(_) {
+    return new Api(_);
+  };
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
   ns.Conf = function(_) {
-    _.settings = _.get(_.preloaded_data, 'SETTINGS', {});
+    _.settings = ns.get(_.preloaded_data, 'SETTINGS', {});
   };
 }(Misago.prototype));
 
@@ -136,15 +464,15 @@
 
   ns.Outlet = {
     factory: function(_) {
-      if (_._outlet) {
-        m.mount(document.getElementById(_._outlet),
+      if (_.setup.fixture) {
+        m.mount(document.getElementById(_.setup.fixture),
                 _.component(ns.ForumLayout));
       }
     },
 
     destroy: function(_) {
-      if (_._outlet) {
-        m.mount(_._outlet, null);
+      if (_.setup.fixture) {
+        m.mount(_.setup.fixture, null);
       }
     }
   };
@@ -153,27 +481,153 @@
 (function (ns) {
   'use strict';
 
-  var prefixUrl = function(prefix) {
-    return function(url) {
-      return prefix + url;
-    };
-  };
-
   var Router = function(_) {
+    var self = this;
     this.base_url = $('base').attr('href');
 
-    this.url = function() {
-      return '/'
-    }
+    this.static_url = ns.get(_.preloaded_data, 'STATIC_URL', '/');
+    this.media_url = ns.get(_.preloaded_data, 'MEDIA_URL', '/');
+
+    // Routing
+    this.urls = {};
+    this.reverses = {};
+
+    var populatePatterns = function(urlconf) {
+      urlconf.patterns().forEach(function(url) {
+        // set service container on component
+        url.component.container = _;
+
+        var final_pattern = self.base_url + url.pattern;
+        final_pattern = final_pattern.replace('//', '/');
+
+        self.urls[final_pattern] = url.component;
+        self.reverses[url.name] = final_pattern;
+      });
+    };
+
+    this.startRouting = function(urlconf, fixture) {
+      populatePatterns(urlconf);
+      this.fixture = fixture;
 
-    // Media/Static url functions
-    this.staticUrl = prefixUrl(_.get(_.preloaded_data, 'STATIC_URL', '/'));
-    this.mediaUrl = prefixUrl(_.get(_.preloaded_data, 'MEDIA_URL', '/'));
+      m.route.mode = 'pathname';
+      m.route(fixture, '/', this.urls);
+    };
+
+    this.url = function(name) {
+      return this.reverses[name];
+    };
+
+    // Delegate clicks
+    this.delegate_element = null;
+    this.delegate_name = 'click.misago-router';
+
+    this.cleanUrl = function(url) {
+      if (!url) { return; }
+
+      // Is link relative?
+      var is_relative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';
+
+      // If link contains host, validate to see if its outgoing
+      if (!is_relative) {
+        var location = window.location;
+
+        // If protocol matches current one, strip it from string
+        // otherwhise stop handler
+        if (url.substr(0, 2) !== '//') {
+          var protocol = url.substr(0, location.protocol.length + 2);
+          if (protocol !== location.protocol + '//') { return; }
+          url = url.substr(location.protocol.length + 2);
+        } else {
+          url = url.substr(2);
+        }
+
+        // Host checks out?
+        if (url.substr(0, location.host.length) !== location.host) { return; }
+        url = url.substr(location.host.length);
+      }
+
+      // Is link within Ember app?
+      if (url.substr(0, this.base_url.length) !== this.base_url) { return; }
+
+      // Is link to media/static/avatar server?
+      if (url.substr(0, this.static_url.length) === this.static_url) { return; }
+
+      if (url.substr(0, this.media_url.length) === this.media_url) { return; }
+
+      var avatars_url = '/user-avatar/';
+      if (url.substr(0, avatars_url.length) === avatars_url) { return; }
+
+      return url;
+    };
+
+    this.delegateClicks = function(element) {
+      this.delegate_element = element;
+      $(this.delegate_element).on(this.delegate_name, 'a', function(e) {
+        var clean_url = self.cleanUrl(e.target.href);
+        if (clean_url) {
+          if (clean_url != m.route()) {
+            m.route(clean_url);
+          }
+          e.preventDefault();
+        }
+      });
+    };
+
+    this.destroy = function() {
+      $(this.delegate_element).off(this.delegate_name);
+    };
+
+    // Media/Static url
+    var prefixUrl = function(prefix) {
+      return function(url) {
+        return prefix + url;
+      };
+    };
+
+    this.staticUrl = prefixUrl(ns.get(_.preloaded_data, 'STATIC_URL', '/'));
+    this.mediaUrl = prefixUrl(ns.get(_.preloaded_data, 'MEDIA_URL', '/'));
   };
 
   ns.RouterFactory = function(_) {
     return new Router(_);
   };
+
+  ns.startRouting = function(_) {
+    _.router.startRouting(ns.urls, document.getElementById('router-fixture'));
+    _.router.delegateClicks(document.getElementById(_.setup.fixture));
+  };
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  ns.PageTitle = function(_) {
+    _._setTitle = function(title) {
+      if (typeof title === 'string') {
+        title = {title: title};
+      }
+
+      var complete_title = title.title;
+
+      if (typeof title.page !== 'undefined' && title.page > 1) {
+        complete_title += ' (' + interpolate(gettext('page %(page)s'), { page:title.page }, true) + ')';
+      }
+
+      if (typeof title.parent !== 'undefined') {
+        complete_title += ' | ' + title.parent;
+      }
+
+      document.title = complete_title + ' | ' + this.settings.forum_name;
+    };
+
+    _.setTitle = function(title) {
+      if (title) {
+        this._setTitle(title);
+      } else {
+        document.title = this.settings.forum_name;
+      }
+    };
+  };
 }(Misago.prototype));
 
 (function (ns) {
@@ -309,3 +763,85 @@
     };
   };
 } (Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  ns.startsWith = function(string, beginning) {
+    return string.indexOf(beginning) === 0;
+  };
+
+  ns.endsWith = function(string, tail) {
+    return string.indexOf(tail, string.length - tail.length) !== -1;
+  };
+}(Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  ns.UrlConfInvalidComponentError = function() {
+    this.message = 'component argument should be array or object';
+  };
+
+  ns.UrlConf = function() {
+    var self = this;
+    this._patterns = [];
+
+    this.patterns = function() {
+      return this._patterns;
+    };
+
+    var prefixPattern = function(prefix, pattern) {
+      return (prefix + pattern).replace('//', '/');
+    };
+
+    var include = function(prefix, patterns) {
+      for (var i = 0; i < patterns.length; i ++) {
+        self.url(prefixPattern(prefix, patterns[i].pattern),
+                 patterns[i].component,
+                 patterns[i].name);
+      }
+    };
+
+    this.url = function(pattern, component, name) {
+      if (typeof component !== 'object') {
+        throw new ns.UrlConfInvalidComponentError();
+      }
+
+      if (pattern === '') {
+        pattern = '/';
+      }
+
+      if (component instanceof ns.UrlConf) {
+        include(pattern, component.patterns());
+      } else {
+        this._patterns.push({
+          pattern: pattern,
+          component: component,
+          name: name
+        });
+      }
+    };
+  };
+} (Misago.prototype));
+
+(function (ns) {
+  'use strict';
+
+  ns.loadingPage = function(_) {
+    return m('.page.page-loading', _.component(ns.Loader));
+  };
+} (Misago.prototype));
+
+(function (ns, UrlConf) {
+  'use strict';
+
+  var urls = new UrlConf();
+  urls.url('/', ns.IndexPage, 'index');
+
+  // Legal pages
+  urls.url('/terms-of-service/', ns.TermsOfServicePage, 'terms_of_service');
+  urls.url('/privacy-policy/', ns.PrivacyPolicyPage, 'privacy_policy');
+
+  ns.urls = urls;
+} (Misago.prototype, Misago.prototype.UrlConf));

+ 1 - 1
misago/static/misago/js/misago.js.map

@@ -1 +1 @@
-{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","preloaded_data","SETTINGS","_services","addService","name","factory","order","push","item","after","get","before","_initServices","services","ordered_services","OrderedList","forEach","undefined","service_instance","_destroyServices","reverse","destroy","registerCoreServices","Conf","RouterFactory","Outlet","component","arguments_array","i","arguments","length","m","apply","_outlet","init","outlet","ForumLayout","view","ctrl","_","ForumNavbar","prototype","desktop_navbar","settings","forum_branding_display","href","router","url","src","static_url","alt","forum_name","forum_branding_text","mount","document","getElementById","prefixUrl","prefix","Router","base_url","$","attr","media_url","has","obj","key","hasOwnProperty","value","pop","returnValue","items","is_ordered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n  'use strict';\n\n  window.Misago = function() {\n\n    var ns = Object.getPrototypeOf(this);\n    var self = this;\n\n    // Preloaded data\n    this.preloaded_data = {\n      // Empty settings\n      SETTINGS: {}\n    };\n\n    // Services\n    this._services = [];\n    this.addService = function(name, factory, order) {\n      this._services.push({\n        name: name,\n        item: factory,\n        after: this.get(order, 'after'),\n        before: this.get(order, 'before')\n      });\n    };\n\n    this._initServices = function(services) {\n      var ordered_services = new ns.OrderedList(services).order(false);\n      ordered_services.forEach(function (item) {\n        var factory = null;\n        if (item.item.factory !== undefined) {\n          factory = item.item.factory;\n        } else {\n          factory = item.item;\n        }\n\n        var service_instance = factory(self);\n        if (service_instance) {\n          self[item.name] = service_instance;\n        }\n      });\n    };\n\n    this._destroyServices = function(services) {\n      var ordered_services = new ns.OrderedList(services).order();\n      ordered_services.reverse();\n      ordered_services.forEach(function (item) {\n        if (item.destroy !== undefined) {\n          item.destroy(self);\n        }\n      });\n    };\n\n    this.registerCoreServices = function() {\n      this.addService('conf', ns.Conf);\n      this.addService('router', ns.RouterFactory);\n      this.addService('outlet', ns.Outlet);\n    };\n\n    // Component factory\n    this.component = function() {\n      var arguments_array = [];\n      for (var i = 0; i < arguments.length; i += 1) {\n        arguments_array.push(arguments[i]);\n      }\n\n      if (arguments_array[arguments_array.length - 1] !== this) {\n        arguments_array.push(this);\n      }\n\n      return m.component.apply(undefined, arguments_array);\n    };\n\n    // App ini/destory\n    this._outlet = null;\n    this.init = function(outlet) {\n      this._outlet = outlet || null;\n      this._initServices(this._services);\n    };\n\n    this.destroy = function() {\n      this._destroyServices();\n    };\n  };\n}());\n\n(function (ns) {\n  'use strict';\n\n  ns.ForumLayout = {\n    view: function(ctrl, _) {\n      return [\n        _.component(ns.ForumNavbar)\n      ];\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.ForumNavbar = {\n    view: function(ctrl, _) {\n      var desktop_navbar = [];\n\n      if (_.settings.forum_branding_display) {\n        desktop_navbar.push(\n          m('a.navbar-brand', {href: _.router.url('misago:index')}, [\n            m('img', {\n              src: _.router.static_url('misago/img/site-logo.png'),\n              alt: _.settings.forum_name\n            }),\n            _.settings.forum_branding_text\n          ])\n        );\n      }\n\n      return m('nav.navbar.navbar-default.navbar-static-top[role=\"navigation\"]', [\n        m('.container.hidden-xs.hidden-sm', desktop_navbar)\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Conf = function(_) {\n    _.settings = _.get(_.preloaded_data, 'SETTINGS', {});\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Outlet = {\n    factory: function(_) {\n      if (_._outlet) {\n        m.mount(document.getElementById(_._outlet),\n                _.component(ns.ForumLayout));\n      }\n    },\n\n    destroy: function(_) {\n      if (_._outlet) {\n        m.mount(_._outlet, null);\n      }\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var prefixUrl = function(prefix) {\n    return function(url) {\n      return prefix + url;\n    };\n  };\n\n  var Router = function(_) {\n    this.base_url = $('base').attr('href');\n\n    // Media/Static url functions\n    this.static_url = prefixUrl(_.get(_.preloaded_data, 'STATIC_URL', '/'));\n    this.media_url = prefixUrl(_.get(_.preloaded_data, 'MEDIA_URL', '/'));\n  };\n\n  ns.RouterFactory = function(_) {\n    return new Router(_);\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.has = function(obj, key) {\n    if (obj !== undefined) {\n      return obj.hasOwnProperty(key);\n    } else {\n      return false;\n    }\n  };\n\n  ns.get = function(obj, key, value) {\n    if (ns.has(obj, key)) {\n      return obj[key];\n    } else if (value !== undefined) {\n      return value;\n    } else {\n      return undefined;\n    }\n  };\n\n  ns.pop = function(obj, key, value) {\n    var returnValue = ns.get(obj, key, value);\n    if (ns.has(obj, key)) {\n      delete obj[key];\n    }\n    return returnValue;\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.OrderedList = function(items) {\n    this.is_ordered = false;\n    this._items = items || [];\n\n    this.add = function(key, item, order) {\n      this._items.push({\n        key: key,\n        item: item,\n        after: ns.get(order, 'after'),\n        before: ns.get(order, 'before')\n      });\n    };\n\n    this.get = function(key, value) {\n      for (var i = 0; i < this._items.length; i++) {\n        if (this._items[i].key === key) {\n          return this._items[i].item;\n        }\n      }\n\n      return value;\n    };\n\n    this.has = function(key) {\n      return this.get(key) !== undefined;\n    };\n\n    this.values = function() {\n      var values = [];\n      for (var i = 0; i < this._items.length; i++) {\n        values.push(this._items[i].item);\n      }\n      return values;\n    };\n\n    this.order = function(values_only) {\n      if (!this.is_ordered) {\n        this._items = this._order(this._items);\n        this.is_ordered = true;\n      }\n\n      if (values_only || typeof values_only === 'undefined') {\n        return this.values();\n      } else {\n        return this._items;\n      }\n    };\n\n    this._order = function(unordered) {\n      // Index of unordered items\n      var index = [];\n      unordered.forEach(function (item) {\n        index.push(item.key);\n      });\n\n      // Ordered items\n      var ordered = [];\n      var ordering = [];\n\n      // First pass: register items that\n      // don't specify their order\n      unordered.forEach(function (item) {\n        if (!item.after && !item.before) {\n          ordered.push(item);\n          ordering.push(item.key);\n        }\n      });\n\n      // Second pass: keep iterating items\n      // until we hit iterations limit or finish\n      // ordering list\n      function insertItem(item) {\n        var insertAt = -1;\n        if (ordering.indexOf(item.key) === -1) {\n          if (item.after) {\n            insertAt = ordering.indexOf(item.after);\n            if (insertAt !== -1) {\n              insertAt += 1;\n            }\n          } else if (item.before) {\n            insertAt = ordering.indexOf(item.before);\n          }\n\n          if (insertAt !== -1) {\n            ordered.splice(insertAt, 0, item);\n            ordering.splice(insertAt, 0, item.key);\n          }\n        }\n      }\n\n      var iterations = 200;\n      while (iterations > 0 && index.length !== ordering.length) {\n        iterations -= 1;\n        unordered.forEach(insertItem);\n      }\n\n      return ordered;\n    };\n  };\n} (Misago.prototype));\n"],"sourceRoot":"/source/"}
+{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","preloaded_data","SETTINGS","_services","addService","name","factory","order","push","item","after","get","before","_initServices","services","ordered_services","OrderedList","forEach","undefined","service_instance","_destroyServices","reverse","destroy","registerCoreServices","Conf","RouterFactory","Outlet","startRouting","component","arguments_array","i","arguments","length","m","apply","setup","init","fixture","in_test","persistent","el","isInit","context","retain","ForumLayout","view","ctrl","_","ForumNavbar","config","ForumFooter","prototype","IndexPage","legalPageFactory","type_name","default_title","controller","console","log","vm","container","loadingPage","TermsOfServicePage","gettext","PrivacyPolicyPage","Loader","setupMarkup","MisagoMarkup","content","trust","PageHeader","options","title","legalLink","legal_type","url","settings","router","href","FooterNav","isVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","indexOf","items","nav","FooterMisagoBranding","BrandFull","branding","children","src","staticUrl","alt","forum_name","desktop_navbar","forum_branding_display","forum_branding_text","route","mount","document","getElementById","Router","base_url","$","attr","urls","reverses","populatePatterns","urlconf","patterns","final_pattern","pattern","replace","mode","delegate_element","delegate_name","isSiteUrl","delegateClicks","element","on","e","target","siteUrl","preventDefault","off","prefixUrl","prefix","mediaUrl","has","obj","key","hasOwnProperty","value","pop","returnValue","is_ordered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","ordered","splice","index","iterations","startsWith","string","beginning","endsWith","tail","UrlConfInvalidComponentError","message","UrlConf","_patterns","prefixPattern","include"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n  'use strict';\n\n  window.Misago = function() {\n\n    var ns = Object.getPrototypeOf(this);\n    var self = this;\n\n    // Preloaded data\n    this.preloaded_data = {\n      // Empty settings\n      SETTINGS: {}\n    };\n\n    // Services\n    this._services = [];\n    this.addService = function(name, factory, order) {\n      this._services.push({\n        name: name,\n        item: factory,\n        after: this.get(order, 'after'),\n        before: this.get(order, 'before')\n      });\n    };\n\n    this._initServices = function(services) {\n      var ordered_services = new ns.OrderedList(services).order(false);\n      ordered_services.forEach(function (item) {\n        var factory = null;\n        if (item.item.factory !== undefined) {\n          factory = item.item.factory;\n        } else {\n          factory = item.item;\n        }\n\n        var service_instance = factory(self);\n        if (service_instance) {\n          self[item.name] = service_instance;\n        }\n      });\n    };\n\n    this._destroyServices = function(services) {\n      var ordered_services = new ns.OrderedList(services).order();\n      ordered_services.reverse();\n      ordered_services.forEach(function (item) {\n        if (item.destroy !== undefined) {\n          item.destroy(self);\n        }\n      });\n    };\n\n    this.registerCoreServices = function() {\n      this.addService('conf', ns.Conf);\n      this.addService('router', ns.RouterFactory);\n      this.addService('outlet', ns.Outlet);\n      this.addService('start-routing', ns.startRouting);\n    };\n\n    // Component factory\n    this.component = function() {\n      var arguments_array = [];\n      for (var i = 0; i < arguments.length; i += 1) {\n        arguments_array.push(arguments[i]);\n      }\n\n      arguments_array.push(this);\n      return m.component.apply(undefined, arguments_array);\n    };\n\n    // App init/destory\n    this.setup = false;\n    this.init = function(setup) {\n      this.setup = {\n        fixture: ns.get(setup, 'fixture', null),\n        in_test: ns.get(setup, 'in_test', false)\n      };\n\n      this._initServices(this._services);\n    };\n\n    this.destroy = function() {\n      this._destroyServices();\n    };\n  };\n}());\n\n\n(function (ns) {\n  'use strict';\n\n  var persistent = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  ns.ForumLayout = {\n    view: function(ctrl, _) {\n      return [\n        _.component(ns.ForumNavbar),\n        m('#router-fixture', {config: persistent}),\n        _.component(ns.ForumFooter)\n      ];\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.IndexPage = {\n    view: function() {\n      return [\n        m('h1', 'Forum index page!'),\n        m('p', 'Lorem ipsum dolor met sit amet elit.'),\n        m('p', 'Sequar elit dolor nihi putto.')\n      ];\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var legalPageFactory = function(type_name, default_title) {\n    return {\n      controller: function() {\n        console.log('controller!');\n      },\n      vm: function() {\n\n      },\n      view: function() {\n        var _ = this.container;\n\n        if (true) {\n          return ns.loadingPage(_);\n        } else {\n          return m('.page.page-legal.page-legal-' + type_name.replace('_', '-'), [\n            _.component(ns.PageHeader, {title: ns.get(_.settings, type_name + '_title', default_title)}),\n            m('p', 'Si pacem sequar elit bellum nihi equit.')\n          ]);\n        }\n      }\n    };\n  };\n\n  ns.TermsOfServicePage = legalPageFactory(\n    'terms_of_service', gettext('Terms of service'));\n  ns.PrivacyPolicyPage = legalPageFactory(\n    'privacy_policy', gettext('Privacy policy'));\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Loader = {\n    view: function() {\n      return m('.loader.sk-folding-cube', [\n        m('.sk-cube1.sk-cube'),\n        m('.sk-cube2.sk-cube'),\n        m('.sk-cube4.sk-cube'),\n        m('.sk-cube3.sk-cube')\n      ]);\n    }\n  };\n} (Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var setupMarkup = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  ns.MisagoMarkup = {\n    view: function(ctrl, content) {\n      return m('article.misago-markup', {config: setupMarkup}, m.trust(content));\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.PageHeader = {\n    view: function(ctrl, options) {\n      return m('.page-header',\n        m('.container', [\n          m('h1', options.title),\n        ])\n      );\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var legalLink = function(_, legal_type, default_title) {\n    var url = ns.get(_.settings, legal_type + '_link');\n    if (!url && ns.get(_.settings, legal_type)) {\n      url = _.router.url(legal_type);\n    }\n\n    if (url) {\n      return m('li',\n        m('a', {href: url}, ns.get(_.settings, legal_type + '_title', default_title))\n      );\n    } else {\n      return null;\n    }\n  };\n\n  ns.FooterNav = {\n    isVisible: function(settings) {\n      return [\n        !!settings.forum_footnote,\n        !!settings.terms_of_service,\n        !!settings.terms_of_service_link,\n        !!settings.privacy_policy,\n        !!settings.privacy_policy_link\n      ].indexOf(true) !== -1;\n    },\n    view: function(ctrl, _) {\n      var items = [];\n\n      if (_.settings.forum_footnote) {\n        items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n      }\n\n      items.push(legalLink(_, 'terms_of_service', gettext('Terms of service')));\n      items.push(legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n      return m('ul.list-inline.footer-nav', items);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.ForumFooter = {\n    view: function(ctrl, _) {\n      var nav = null;\n      if (ns.FooterNav.isVisible(_.settings)) {\n        nav = _.component(ns.FooterNav);\n      }\n\n      return m('footer.forum-footer', [\n        m('.container',\n          m('.footer-content', [\n            nav,\n            _.component(ns.FooterMisagoBranding)\n          ])\n        )\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.FooterMisagoBranding = {\n    view: function() {\n      return m('a.misago-branding[href=http://misago-project.org]', [\n        \"powered by \", m('strong', \"misago\")\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.BrandFull = {\n    view: function(ctrl, branding, _) {\n      var children = [\n        m('img', {\n          src: _.router.staticUrl('misago/img/site-logo.png'),\n          alt: _.settings.forum_name\n        })\n      ];\n\n      if (branding) {\n        children.push(branding);\n      }\n\n      return m('a.navbar-brand', {href: _.router.url('index')}, children);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.ForumNavbar = {\n    view: function(ctrl, _) {\n      var desktop_navbar = [];\n\n      if (_.settings.forum_branding_display) {\n        desktop_navbar.push(_.component(ns.BrandFull, _.settings.forum_branding_text));\n      }\n\n      desktop_navbar.push(m('ul.nav.navbar-nav', [\n        m('li', m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')),\n        m('li', m(\"a\", {config: m.route, href: _.router.url('test')}, 'Test'))\n      ]));\n\n      return m('nav.navbar.navbar-default.navbar-static-top[role=\"navigation\"]', [\n        m('.container.navbar-full.hidden-xs.hidden-sm', desktop_navbar)\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Conf = function(_) {\n    _.settings = ns.get(_.preloaded_data, 'SETTINGS', {});\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Outlet = {\n    factory: function(_) {\n      if (_.setup.fixture) {\n        m.mount(document.getElementById(_.setup.fixture),\n                _.component(ns.ForumLayout));\n      }\n    },\n\n    destroy: function(_) {\n      if (_.setup.fixture) {\n        m.mount(_.setup.fixture, null);\n      }\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var Router = function(_) {\n    var self = this;\n    this.base_url = $('base').attr('href');\n\n    // Routing\n    this.urls = {};\n    this.reverses = {};\n\n    var populatePatterns = function(urlconf) {\n      urlconf.patterns().forEach(function(url) {\n        // set service container on component\n        url.component.container = _;\n\n        var final_pattern = self.base_url + url.pattern;\n        final_pattern = final_pattern.replace('//', '/');\n\n        self.urls[final_pattern] = url.component;\n        self.reverses[url.name] = final_pattern;\n      });\n    };\n\n    this.startRouting = function(urlconf, fixture) {\n      populatePatterns(urlconf);\n\n      m.route.mode = 'pathname';\n      m.route(fixture, '/', this.urls);\n    };\n\n    this.url = function(name) {\n      return this.reverses[name];\n    };\n\n    // Delegate clicks\n    this.delegate_element = null;\n    this.delegate_name = 'click.misago-router';\n\n    this.isSiteUrl = function(url) {\n      return false;\n    };\n\n    this.delegateClicks = function(element) {\n      this.delegate_element = element;\n      $(this.delegate_element).on(this.delegate_name, 'a', function(e) {\n        var url = e.target.href;\n        if (siteUrl(url)) {\n          m.route(url);\n          e.preventDefault();\n        }\n      });\n    };\n\n    this.destroy = function() {\n      $(this.delegate_element).off(this.delegate_name);\n    };\n\n    // Media/Static url\n    var prefixUrl = function(prefix) {\n      return function(url) {\n        return prefix + url;\n      };\n    };\n\n    this.staticUrl = prefixUrl(_.get(_.preloaded_data, 'STATIC_URL', '/'));\n    this.mediaUrl = prefixUrl(_.get(_.preloaded_data, 'MEDIA_URL', '/'));\n  };\n\n  ns.RouterFactory = function(_) {\n    return new Router(_);\n  };\n\n  ns.startRouting = function(_) {\n    _.router.startRouting(ns.urls, document.getElementById('router-fixture'));\n    _.router.delegateClicks(document.getElementById(_.setup.fixture));\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.has = function(obj, key) {\n    if (obj !== undefined) {\n      return obj.hasOwnProperty(key);\n    } else {\n      return false;\n    }\n  };\n\n  ns.get = function(obj, key, value) {\n    if (ns.has(obj, key)) {\n      return obj[key];\n    } else if (value !== undefined) {\n      return value;\n    } else {\n      return undefined;\n    }\n  };\n\n  ns.pop = function(obj, key, value) {\n    var returnValue = ns.get(obj, key, value);\n    if (ns.has(obj, key)) {\n      delete obj[key];\n    }\n    return returnValue;\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.OrderedList = function(items) {\n    this.is_ordered = false;\n    this._items = items || [];\n\n    this.add = function(key, item, order) {\n      this._items.push({\n        key: key,\n        item: item,\n        after: ns.get(order, 'after'),\n        before: ns.get(order, 'before')\n      });\n    };\n\n    this.get = function(key, value) {\n      for (var i = 0; i < this._items.length; i++) {\n        if (this._items[i].key === key) {\n          return this._items[i].item;\n        }\n      }\n\n      return value;\n    };\n\n    this.has = function(key) {\n      return this.get(key) !== undefined;\n    };\n\n    this.values = function() {\n      var values = [];\n      for (var i = 0; i < this._items.length; i++) {\n        values.push(this._items[i].item);\n      }\n      return values;\n    };\n\n    this.order = function(values_only) {\n      if (!this.is_ordered) {\n        this._items = this._order(this._items);\n        this.is_ordered = true;\n      }\n\n      if (values_only || typeof values_only === 'undefined') {\n        return this.values();\n      } else {\n        return this._items;\n      }\n    };\n\n    this._order = function(unordered) {\n      // Index of unordered items\n      var index = [];\n      unordered.forEach(function (item) {\n        index.push(item.key);\n      });\n\n      // Ordered items\n      var ordered = [];\n      var ordering = [];\n\n      // First pass: register items that\n      // don't specify their order\n      unordered.forEach(function (item) {\n        if (!item.after && !item.before) {\n          ordered.push(item);\n          ordering.push(item.key);\n        }\n      });\n\n      // Second pass: keep iterating items\n      // until we hit iterations limit or finish\n      // ordering list\n      function insertItem(item) {\n        var insertAt = -1;\n        if (ordering.indexOf(item.key) === -1) {\n          if (item.after) {\n            insertAt = ordering.indexOf(item.after);\n            if (insertAt !== -1) {\n              insertAt += 1;\n            }\n          } else if (item.before) {\n            insertAt = ordering.indexOf(item.before);\n          }\n\n          if (insertAt !== -1) {\n            ordered.splice(insertAt, 0, item);\n            ordering.splice(insertAt, 0, item.key);\n          }\n        }\n      }\n\n      var iterations = 200;\n      while (iterations > 0 && index.length !== ordering.length) {\n        iterations -= 1;\n        unordered.forEach(insertItem);\n      }\n\n      return ordered;\n    };\n  };\n} (Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.startsWith = function(string, beginning) {\n    return string.indexOf(beginning) === 0;\n  };\n\n  ns.endsWith = function(string, tail) {\n    return string.indexOf(tail, string.length - tail.length) !== -1;\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.UrlConfInvalidComponentError = function() {\n    this.message = 'component argument should be array or object';\n  };\n\n  ns.UrlConf = function() {\n    var self = this;\n    this._patterns = [];\n\n    this.patterns = function() {\n      return this._patterns;\n    };\n\n    var prefixPattern = function(prefix, pattern) {\n      return (prefix + pattern).replace('//', '/');\n    };\n\n    var include = function(prefix, patterns) {\n      for (var i = 0; i < patterns.length; i ++) {\n        self.url(prefixPattern(prefix, patterns[i].pattern),\n                 patterns[i].component,\n                 patterns[i].name);\n      }\n    };\n\n    this.url = function(pattern, component, name) {\n      if (typeof component !== 'object') {\n        throw new ns.UrlConfInvalidComponentError();\n      }\n\n      if (pattern === '') {\n        pattern = '/';\n      }\n\n      if (component instanceof ns.UrlConf) {\n        include(pattern, component.patterns());\n      } else {\n        this._patterns.push({\n          pattern: pattern,\n          component: component,\n          name: name\n        });\n      }\n    };\n  };\n} (Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.loadingPage = function(_) {\n    return m('.page.page-loading', _.component(ns.Loader));\n  };\n} (Misago.prototype));\n\n(function (ns, UrlConf) {\n  'use strict';\n\n  var urls = new UrlConf();\n  urls.url('/', ns.IndexPage, 'index');\n\n  // Legal pages\n  urls.url('/terms-of-service/', ns.TermsOfServicePage, 'terms_of_service');\n  urls.url('/privacy-policy/', ns.PrivacyPolicyPage, 'privacy_policy');\n\n  ns.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}

+ 4 - 2
misago/templates/misago/base.html

@@ -34,7 +34,7 @@
       {% include "misago/footer.html" %}
     </noscript>
 
-    <section id="main"></section>
+    <section id="misago-fixture"></section>
 
     {% include "misago/auth.html" %}
 
@@ -48,7 +48,9 @@
       var misago = new Misago();
       misago.registerCoreServices();
       {% include "misago/preloaded_data.js" %}
-      misago.init('main');
+      misago.init({
+        fixture: 'misago-fixture'
+      });
     </script>
 
   </body>