<!--
  ~ 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.
  -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>Continuum</title>

  <link rel="stylesheet" type="text/css" href="continuum_files/tigris.css" media="screen">
  <link rel="stylesheet" type="text/css" href="continuum_files/print.css" media="print">

  <script src="continuum_files/tigris.js" type="text/javascript"></script></head>

<body onload="focus()" class="composite">

<div id="banner">
  <table border="1" cellpadding="8" cellspacing="0" width="100%">
    <tbody><tr>
      <td>
        <a href="http://www.apache.org/">
          Your company logo here
        </a>
      </td>
      <td>
        <a href="http://maven.apache.org/continuum">
          <img src="continuum_files/continuum_logo_75.gif" alt="Continuum" align="right" border="0">
        </a>
      </td>
    </tr>
    </tbody></table>
</div>

<div id="breadcrumbs">
  <div style="float: right">
    <a href="http://maven.apache.org/continuum">Continuum</a> |
    <a href="http://maven.apache.org/">Maven</a> |
    <a href="http://www.apache.org/">Apache</a>
  </div>

  <div>
    Welcome, <b>Guest</b> | <a href="login.html">Login</a>
  </div>
</div>

<table id="main" border="0" cellpadding="4" cellspacing="0" width="100%">
<tbody><tr valign="top">
  <td id="leftcol" width="30%">
    <div id="navcolum">
      <div id="projectmenu" class="toolgroup">
        <div class="label">Continuum</div>

        <div class="body">
          <div><a href="index.html">Show Projects</a></div>

          <div><a href="schedule.html">View Build Schedule</a></div>
        </div>
      </div>

      <div id="projecttools" class="toolgroup">
        <div class="label">Add Project</div>

        <div class="body">
          <div><a href="addMaven2Project.html">Maven 2.0+ Project</a></div>

          <div><a href="addMaven1Project.html">Maven 1.x Project</a></div>

          <div><a href="addAntProject.html">Ant Project</a></div>

          <div><a href="addShellProject.html">Shell Project</a></div>
        </div>
      </div>

      <div id="projectimport" class="toolgroup">
        <div class="label">Import Project</div>

        <div class="body">
          <div>
            <a href="addCruiseControlProject.html">CruiseControl</a>
          </div>
        </div>
      </div>

      <div style="margin-top: 5em; color: #555; border: 1px dashed black; padding: 1em;">
        <p>Notes:</p>
        <ul>
          <li>Log out only drops you here if Guest does not have priviledges to view access and pages, otherwise logout
            drops you to the index page</li>
          <li>Create user link is only present if the system allows anonymous account creation</li>
        </ul>
      </div>
    </div>
  </td>
  <td>
    <div id="bodycol">
      <div class="app">
        <div id="axial" class="h3">
          <h3>Login</h3>

          <form method="post" action="viewProject.html">
            <input type="hidden" name="fid" value="antProject"/>

            <input type="hidden" name="action" value="addEntity"/>
            <input type="hidden" name="view" value="Summary.vm"/>
            <input type="hidden" name="id" value="$id"/>

            <div class="axial">
              <table border="1" cellspacing="2" cellpadding="3" width="100%">
                <tr>

                  <th>Username</th>


                  <td>
                    <input type="text" name="username" value="" size="40"/>
                    <small><a href="createUser.html">Create A New Account</a></small>
                  </td>
                </tr>
                <tr>
                  <th>Password</th>


                  <td>
                    <input type="password" value="" size="40"/>
                    <small><a href="forgotPassword.html">Forgotten password?</a></small>
                  </td>
                </tr>
                <tr>
                  <th>&nbsp;</th>


                  <td>
                    <input type="checkbox" checked="checked"/>&nbsp;Remember me
                  </td>
                </tr>
              </table>
              <div class="functnbar3">
                <input type="submit" value="Submit"/>
              </div>
            </div>
          </form>

        </div>
      </div>

    </div></td>
</tr>
</tbody>
</table>

<div id="footer">
  <table border="0" cellpadding="4" cellspacing="0">
    <tbody><tr>
      <td>
        Continuum &#169; 2005 Apache Software Foundation
      </td>
    </tr>
    </tbody></table>
</div>

</body></html>