/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
/* Non-responsive overrides
 *
 * Utilitze the following CSS to disable the responsive-ness of the container,
 * grid system, and navbar.
 */
/* Reset the container */
.container {
  max-width: none !important;
  width: 70%;
}
.container .navbar-header,
.container .navbar-collapse {
  margin-right: 0;
  margin-left: 0;
}
/* Always float the navbar header */
.navbar-header {
  float: left;
}
/* Undo the collapsing navbar */
.navbar-collapse {
  display: block !important;
  height: auto !important;
  padding-bottom: 0;
  overflow: visible !important;
}
.navbar-toggle {
  display: none;
}
.navbar-collapse {
  border-top: 0;
}
.navbar-brand {
  margin-left: -15px;
}
/* Always apply the floated nav */
.navbar-nav {
  float: left;
  margin: 0;
}
.navbar-nav > li {
  float: left;
}
.navbar-nav > li > a {
  padding: 15px;
}
/* Redeclare since we override the float above */
.navbar-nav.navbar-right {
  float: right;
}
/* Undo custom dropdowns */
.navbar .navbar-nav .open .dropdown-menu {
  position: absolute;
  float: left;
  background-color: #fff;
  border: 1px solid #cccccc;
  border: 1px solid rgba(0, 0, 0, 0.15);
  border-width: 0 1px 1px;
  border-radius: 0 0 4px 4px;
  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
}
.navbar-default .navbar-nav .open .dropdown-menu > li > a {
  color: #333;
}
.navbar .navbar-nav .open .dropdown-menu > li > a:hover,
.navbar .navbar-nav .open .dropdown-menu > li > a:focus,
.navbar .navbar-nav .open .dropdown-menu > .active > a,
.navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
.navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
  color: #fff !important;
  background-color: #428bca !important;
}
.navbar .navbar-nav .open .dropdown-menu > .disabled > a,
.navbar .navbar-nav .open .dropdown-menu > .disabled > a:hover,
.navbar .navbar-nav .open .dropdown-menu > .disabled > a:focus {
  color: #999 !important;
  background-color: transparent !important;
}
html,
body {
  height: 100%;
}
h1 {
  font-size: 24px;
}
h2 {
  font-size: 20px;
}
h3 {
  font-size: 18px;
}
h4 {
  font-size: 16px;
}
.page-header {
  margin-bottom: 5px !important;
  margin-top: 10px !important;
}
.page-header h1 {
  margin-bottom: 0px;
}
.wrapper {
  min-height: 100%;
}
.wrapper .wrapper-content {
  overflow: auto;
  padding-bottom: 120px;
}
.masthead {
  background-color: #f5f4f0;
}
.masthead .masthead-logo {
  display: inline-block;
  background-color: #ff0000;
  font-family: 'Ropa Sans', sans-serif;
  font-size: 3em;
  color: #fff;
  width: 220px;
  float: left;
  padding-left: 20px;
}
.masthead .masthead-logo a {
  color: #fff;
}
.masthead .masthead-logo a:hover {
  text-decoration: none;
}
.masthead .masthead-icons {
  font-size: 3em;
}
.masthead .masthead-icons .masthead-icon {
  margin-left: .2em;
  color: #d3d2d0;
}
pre {
  border: 0px !important;
  border-radius: 0px !important;
  overflow-x: auto;
  background-color: #f7f7f7;
  font-size: 12px;
}
pre code {
  overflow-wrap: normal;
  white-space: pre;
}
th.header {
  cursor: pointer;
  background-image: url(../img/bg.gif);
  background-repeat: no-repeat;
  background-position: center right;
  padding-right: 15px !important;
}
th.headerSortUp {
  background-color: #f5f5f5;
  background-image: url(../img/desc.gif);
}
th.headerSortDown {
  background-color: #f5f5f5;
  background-image: url(../img/asc.gif);
}
td.key {
  width: 25%;
  font-weight: bold;
}
.menu {
  padding: 15px;
  float: left;
  width: 220px;
}
.menu .nav {
  margin-left: -15px;
  margin-right: -15px;
}
.menu .nav-pills > li > a {
  border-radius: 0px;
}
.menu h1 {
  font-size: 16px;
  margin: 10px 0px;
}
.menu ul {
  list-style: none;
  padding: 0;
}
.menu ul li {
  line-height: 150%;
}
.content {
  margin-left: 240px;
}
.committer-icon {
  font-size: 16px;
}
img.diagram-large {
  width: 100%;
}
ul.documentation-list {
  list-style: none;
  padding-left: 20px;
}
.footer {
  clear: both;
  position: relative;
  background-color: #f5f4f0;
  z-index: 10;
  height: 100px;
  margin-top: -100px;
}
