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.

/* Javadoc style sheet */
/* Define colors, fonts and other style attributes here to override the defaults  */
body { 
	background-color: #fff;
	font-family: Arial, Helvetica, sans-serif;
}

a:link {
 color: #00f;
}
a:visited {
 color: #00a;
}

a:active, a:hover {
 color: #f30 !important;
}

ul, li	{
	list-style-type:none ;
	margin:0;
	padding:0;
}

table td{
	padding: 3px;
	border: 1px solid #000;
}
table{
	width:100%;
	border: 1px solid #000;
	border-collapse: collapse;
}

div.overview {
	background-color:#ddd;
	padding: 4px 4px 4px 0;
}
div.overview li, div.framenoframe li {
	display: inline;
}
div.framenoframe {
	text-align: center;
	font-size: x-small;
}
div.framenoframe li {
	margin: 0 3px 0 3px;
}
div.overview li {
	margin:3px 3px 0 3px;
	padding: 4px;
}
li.selected {
	background-color:#888;
	color: #fff;
	font-weight: bold;
}

table.summary {
	margin-bottom: 20px;
}
table.summary td, table.summary th {
	font-weight: bold;
	text-align: left;
	padding: 3px;
}
table.summary th{
	background-color:#036;
	color: #fff;
}
table.summary td{
	background-color:#eee;
	border: 1px solid black;
}

em {
	color: #A00;
}
em.comment {
	color: #390;
}
.string {
	color: #009;
}
div#footer {
	text-align:center;
}
#overview {
	padding:2px;
}
            
            
hr {
	height: 1px;
	color: #000;
}