/*
 * 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.
*/
.wiki-content p {
    margin: 16px 0px 16px 0px;
    padding: 0px;
}
.wiki-content-preview {
    padding: 5px;
    border-left: 1px solid #3c78b5;
    border-right: 1px solid #3c78b5;
}
.wiki-content ul, .wiki-content ol {
    list-style-position: inside;
    margin-top: 2px;
    margin-bottom: 2px;
    padding-top: 0px;
    padding-bottom: 0px;
}
.wiki-content ol {
list-style-type: decimal;
}
.wiki-content ul {
list-style-type: circle;
}
.wiki-content .warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; }
.wiki-content .alertPanel { background: #FFCCCC; border:#C00 1px solid; padding: 8px; margin: 10px; }
.wiki-content .infoPanel { background: #D8E4F1; border:#3c78b5 1px solid; padding: 8px; margin: 10px; }
.wiki-content .noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; text-align:left; margin-top: 5px; margin-bottom: 5px}
.wiki-content .warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; text-align:left; margin-top: 5px; margin-bottom: 5px}
.wiki-content .infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; text-align:left; margin-top: 5px; margin-bottom: 5px}
.wiki-content .tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; text-align:left; margin-top: 5px; margin-bottom: 5px}
.wiki-content .informationMacroPadding { padding: 5px 0 0 5px; }
.wiki-content h1 {
    font-size: 24px;
    line-height: normal;
    font-weight: bold;
    background-color: #f0f0f0;
    color: #003366;
    border-bottom: 1px solid #3c78b5;
    padding: 2px;
    margin: 36px 0px 4px 0px;
}
.wiki-content h2 {
    font-size: 18px;
    line-height: normal;
    font-weight: bold;
    background-color: #f0f0f0;
    border-bottom: 1px solid #3c78b5;
    padding: 2px;
    margin: 27px 0px 4px 0px;
}
.wiki-content h3 {
    font-size: 14px;
    line-height: normal;
    font-weight: bold;
    background-color: #f0f0f0;
    padding: 2px;
    margin: 21px 0px 4px 0px;
}
.wiki-content h4 {
    font-size: 12px;
    line-height: normal;
    font-weight: bold;
    background-color: #f0f0f0;
    padding: 2px;
    margin: 18px 0px 4px 0px;
}
.wiki-content h5 {
    font-size: 10px;
    line-height: normal;
    font-weight: bold;
    background-color: #f0f0f0;
    padding: 2px;
    margin: 14px 0px 4px 0px;
}
.wiki-content h6 {
    font-size: 8px;
    line-height: normal;
    font-weight: bold;
    background-color: #f0f0f0;
    padding: 2px;
    margin: 14px 0px 4px 0px;
}
