/* 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.
 */


body {
  background-color: #fff;
  color: #000;
  font-family: "Helvetica Neue", "DejaVu Sans", "Verdana", sans-serif;
  text-align: center;
  line-height: 150%;
}

a:link, a:visited{
  color: #0044b3;
  text-decoration: none;
}

a:hover{
  text-decoration: underline;
}

img {
  border: none;
}

pre, code {
  font-family: "Monaco", "DejaVu Sans Mono", "Courier New", "Courier";
  font-size: 11pt;
}
pre {
  margin: 0.3em 0 0.3em 0.9em;
  padding: 0;
  line-height: 1.8em;
  white-space: pre-wrap;       /* css-3 */
  white-space: -moz-pre-wrap !important;  /* Mozilla, since 1999 */
}
pre br { display: none; }

h1, h2, h3 {
  font-family: "Gill Sans";
  padding: 0;
  margin: 1.6em 0 0.6em 0;
  line-height: 1.25em;
  letter-spacing: 0.03em;
}

h1 {
  font-size: 2em;
  margin-top: 0;
  padding-bottom: 0.3em;
  border-bottom: 1px solid #808080;
}

h2 {
  font-size: 1.3em;
  padding-bottom: 0.3em;
  border-bottom: 1px solid #a0a0a0;
}

h3 {
  font-size: 1.1em;
}

blockquote {
  padding-left: 2em;
  padding-right: 2em;
  margin-left: 0.3em;
  margin-right: 0;
  font-style: italic;
}

ul {
  list-style-type: disc;
}

ul ul {
  list-style-type: disc;
  padding-left: 1em;
}

table {
  border-spacing: 0;
  width: 100%;
  margin: 0.3em 0 0.3em 0;
}

th, td {
  padding: 0.3em 0.5em 0.3em 0.5em;
  border-bottom: 1px solid #D8D8D8;
  vertical-align: top;
  background-color: #FFFFFF;
}

th, thead td {
  border-bottom: none;
  background-color: #669966;
  color: #ffffff;
  text-align: left;
}


#wrap{
  margin: 1em auto 2em auto;
  text-align: left;
  width: 65em;
}


#header {
  margin: 0 0 3em 18em;
  position: relative;
}

#header .tagline {
  float: right;
  font-size: 1.2em;
  font-weight: bold;
  position: absolute;
  top: 0.6em;
  right: 0;
}


#pages { /* Parent Wrapper for inside boxes */
/*  display: inline; */ /* IE Hack */
  width: 12em;
  float: left;
  margin-right: 2em;
  font-family: "Gill Sans",sans-serif;
  font-size: 11pt;
  text-align: right;
  border-right: 1px solid #ccc;
  padding-right: 2em;
}
#pages ol {
  list-style: none;
  padding: 0;
  margin: 0;
}
#pages ol li {
  padding: 0.3em 0 0.6em 0em;
  color: #669966;
  font-weight: bold;
}
#pages ol li ol {
  margin-top: 0.3em;
  padding: 0.3em 0 0.9em 0.9em;
}
#pages ol li ol li {
  padding: 0.3em 0 0.3em 0em;
}
#pages ol li a  {
  font-weight: normal;
}
#pages form {
  margin-top: 2em;
  padding: 0.3em 0 0.5em 0.5em;
}
#pages ol li p  {
  font-weight: normal;
  color: #000;
  vertical-align: middle;
}


#content { /* Parent Wrapper for inside boxes */
/*  display: inline; *//* IE Hack */
  float: left;
  width: 44em;
  margin-left: 0.3em;
  margin-bottom: 5em;
  word-wrap: break-word; /* prevents container divs from wrapping */
}

ol.toc {
  list-style: none;
  padding: 0;
  margin: 0 0 2em 0;
}
ol.toc li {
  padding: 0.3em 0 0.3em 0;
  margin: 0;
}
ol.toc li ol.toc {
  margin: 0;
  padding-left: 0.9em;
}


#content p.tip, #content p.note {
  margin: 0.9em 0 0 0;
  padding: 0 0 2em 4em;
}
#content p.tip { background: url("../images/tip.png") 0 0 no-repeat; }
#content p.note { background: url("../images/note.png") 0 0 no-repeat; }

#content .footnote {
  margin-top: 2.5em;
}
#content .footnote {
  padding-top: 1.5em;
  border-top: 1px solid #ccc;
}
#content .footnote + .footnote {
  margin-top: 0.5em;
  padding-top: 0;
  border: none;
}
#content .footnote sup { font-weight: bold; }

#content .footnote-links dt { font-weight: bold; }
#content .footnote-links dt:after { content: ": " }
#content .footnote-links dd { }


#footer {
  color: #888;
  border-top: 1px solid #ccc;
  font-size: 0.9em;
  padding: 0.3em;
  margin: 2em 0 3em 0em;
  clear: both;
}
