/*
       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:#222 none repeat scroll 0 0;
    color:#666;
    font-family:Helvetica;
    font-size:72%;
    line-height:1.5em;
    margin:0;
    border-top:1px solid #393939;
  }

  #info{
    background:#ffa;
    border: 1px solid #ffd324;
    -webkit-border-radius: 5px;
    border-radius: 5px;
    clear:both;
    margin:15px 6px 0;
    width:295px;
    padding:4px 0px 2px 10px;
  }
  
  #info > h4{
    font-size:.95em;
    margin:5px 0;
  }
    
  #stage.theme{
    padding-top:3px;
  }

  /* Definition List */
  #stage.theme > dl{
    padding-top:10px;
    clear:both;
    margin:0;
    list-style-type:none;
    padding-left:10px;
    overflow:auto;
  }

  #stage.theme > dl > dt{
    font-weight:bold;
    float:left;
    margin-left:5px;
  }

  #stage.theme > dl > dd{
    width:45px;
    float:left;
    color:#a87;
    font-weight:bold;
  }

  /* Content Styling */
  #stage.theme > h1, #stage.theme > h2, #stage.theme > p{
    margin:1em 0 .5em 13px;
  }

  #stage.theme > h1{
    color:#eee;
    font-size:1.6em;
    text-align:center;
    margin:0;
    margin-top:15px;
    padding:0;
  }

  #stage.theme > h2{
    clear:both;
    margin:0;
    padding:3px;
    font-size:1em;
    text-align:center;
  }

  /* Stage Buttons */
  #stage.theme a.btn{
    border: 1px solid #555;
    -webkit-border-radius: 5px;
    border-radius: 5px;
    text-align:center;
    display:block;
    float:left;
    background:#444;
    width:150px;
    color:#9ab;
    font-size:1.1em;
    text-decoration:none;
    padding:1.2em 0;
    margin:3px 0px 3px 5px;
  }
  #stage.theme a.btn.large{
    width:308px;
    padding:1.2em 0;
  }

  /* Stage Buttons */
  #stage.theme button.btn{
    border: 1px solid #555;
    -webkit-border-radius: 5px;
    border-radius: 5px;
    text-align:center;
    display:block;
    float:left;
    background:#444;
    width:150px;
    color:#9ab;
    font-size:1.1em;
    text-decoration:none;
    padding:1.2em 0;
    margin:3px 0px 3px 5px;
  }
#stage.theme button.btn.large{
    width:308px;
    padding:1.2em 0;
  }

