<!DOCTYPE html>
<!--
    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.
-->
<html lang="en">
<head>
    <title>{{ .Title }} &mdash; Apache MINA</title>

    <link href="/assets/css/common.css" rel="stylesheet" type="text/css"/>
    <link href="/assets/css/mina.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<script src="https://www.apachecon.com/event-images/snippet.js"></script>
<div id="container">
    {{ partial "header.html" (dict "context" . "project" "home") }}

    <div id="content">
        <div id="leftColumn">
            <div id="navigation">
                <a class="acevent" data-format="wide" data-width="170"></a>
                <h5>Latest Downloads</h5>
                <ul>
                    <li><a href="/downloads-mina_2_0.html">Mina {{ .Site.Params.version_mina_2_0 }}</a></li>
                    <li><a href="/downloads-mina_2_1.html">Mina {{ .Site.Params.version_mina_2_1 }}</a></li>
                    <li><a href="/downloads-mina_2_2.html">Mina {{ .Site.Params.version_mina_2_2 }}</a></li>
                    <li><a href="/downloads-ftpserver_1_1.html">FtpServer {{ .Site.Params.version_ftpserver_1_1 }}</a></li>
                    <li><a href="/downloads-ftpserver_1_2.html">FtpServer {{ .Site.Params.version_ftpserver_1_2 }}</a></li>
                    <li><a href="/downloads-sshd.html">SSHD {{ .Site.Params.version_sshd }}</a></li>
                    <li><a href="/downloads-vysper.html">Vysper {{ .Site.Params.version_vysper }}</a></li>
                </ul>
                <h5>Projects</h5>
                <ul>
                    <li><a href="/mina-project/index.html">MINA</a></li>
                    <li><a href="/asyncweb-project/index.html">AsyncWeb</a></li>
                    <li><a href="/ftpserver-project/index.html">FtpServer</a></li>
                    <li><a href="/sshd-project/index.html">SSHD</a></li>
                    <li><a href="/vysper-project/index.html">Vysper</a></li>
                </ul>

                <h5>Community</h5>
                <ul>
                    <li><a href="/contributors.html" class="external-link" rel="nofollow">Team</a></li>
                    <li><a href="https://www.apache.org/licenses/" class="external-link" rel="nofollow">License</a></li>
                    <li><a href="https://www.apache.org/foundation/contributing.html" class="external-link" rel="nofollow">Contributing</a></li>
                    <li><a href="https://www.apache.org/" title="Apache Software Foundation" class="external-link" rel="nofollow">ASF main site</a></li>
                    <li><a href="https://www.apache.org/foundation/thanks.html" class="external-link" rel="nofollow">Thanks</a></li>
                    <li><a href="https://www.apache.org/foundation/sponsorship.html" title="The ASF sponsorship program" class="external-link" rel="nofollow">Sponsorship program</a></li>
                    <li><a href="https://www.apache.org/security/" class="external-link" rel="nofollow">Security</a></li>
                </ul>

                <h3><a name="Navigation-Upcoming"></a>Upcoming</h3>
            </div><!-- navigation -->
        </div><!-- leftColumn -->
        <div id="rightColumn">
            {{ partial "nav-headers.html" . }}
            {{ block "main" . }}{{ end }}
            {{ partial "nav-headers.html" . }}
        </div><!-- rightColumn -->
        <div id="endContent"></div>
    </div><!-- content -->

    {{ partial "footer.html" . }}
</div><!-- container -->

</body>

</html>
