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

<project xmlns="http://maven.apache.org/DECORATION/1.3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/DECORATION/1.3.0 http://maven.apache.org/xsd/decoration-1.3.0.xsd"
         name="Tez">
  <skin>
    <groupId>org.apache.maven.skins</groupId>
    <artifactId>maven-fluido-skin</artifactId>
    <version>1.3.0</version>
  </skin>
  <custom>
    <fluidoSkin>
      <topBarEnabled>true</topBarEnabled>
      <sideBarEnabled>true</sideBarEnabled>
      <leftColumnClass>span2</leftColumnClass>
      <bodyColumnClass>span10</bodyColumnClass>
      <twitter>
        <user>ApacheTez</user>
        <showUser>true</showUser>
      </twitter>
    </fluidoSkin>
  </custom>

<!--
  <bannerLeft>
    <name>Tez</name>
    <href>http://tez.incubator.apache.org/</href>
  </bannerLeft>
-->

  <bannerRight>
    <name>Apache Incubator</name>
    <src>./images/apache-incubator-logo.png</src>
    <href>http://incubator.apache.org/</href>
  </bannerRight>

  <publishDate position="right"/>
  <version position="right"/>

  <body>
    <head>
       <!-- Start of Google analytics 
       <script type="text/javascript">
         var _gaq = _gaq || [];
         _gaq.push(['_setAccount', '']);
         _gaq.push(['_trackPageview']);

         (function() {
            var ga = document.createElement('script'); 
            ga.type = 'text/javascript'; ga.async = true;
            ga.src = ('https:' == document.location.protocol ? 
                      'https://ssl' : 'http://www') + 
                     '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; 
            s.parentNode.insertBefore(ga, s);
          })();
       </script>
       End of Google analytics -->
       <style>
           .well.sidebar-nav {
             background-color: #fff;
           }
           a.externalLink[href^=http] {
             background-image: none;
             padding-right: 0;
           }
           body.topBarEnabled {
             padding-top: 40px;
           }
           #leftColumn .nav-list .active a {
             background-color: #a0a0a0;
           }
           .nav-list .active a:hover {
             background-color: #a0a0a0;
           }
       </style>
    </head>

    <breadcrumbs>
      <item name="Tez" href="http://tez.incubator.apache.org/"/>
    </breadcrumbs>

    <menu name="Getting Started">
      <item name="Overview" href="index.html"/>
      <item name="Install Guide" href="install.html"/>
      <item name="Design Doc" href="https://issues.apache.org/jira/secure/attachment/12588887/Tez%20Design%20v1.1.pdf"/>
      <item name="Talks and Meetup Recordings" href="talks.html"/>
      <item name="Apache Incubator Proposal for Tez" href="http://wiki.apache.org/incubator/TezProposal"/>
      <item name="Project License" href="http://www.apache.org/licenses/LICENSE-2.0.txt"/>
    </menu>

    <menu name="Community">
      <item name="Mailing Lists" href="mail-lists.html"/>
      <item name="Issue Tracking" href="issue-tracking.html"/>
      <item name="Project Team" href="team-list.html"/>
      <item name="User Meetup Group" href="http://www.meetup.com/Apache-Tez-User-Group"/>
    </menu>

    <menu name="Releases">
      <item name="0.2.0-incubating" href="http://www.apache.org/dyn/closer.cgi/incubator/tez/tez-0.2.0-incubating/"/>
      <item name="0.3.0-incubating" href="http://www.apache.org/dyn/closer.cgi/incubator/tez/tez-0.3.0-incubating/"/>
    </menu>

    <menu name="Contribute">
      <item name="JIRA" href="https://issues.apache.org/jira/browse/TEZ" />
      <item name="Git (Read/Write)" href="https://git-wip-us.apache.org/repos/asf/incubator-tez.git" alt="Use git clone https://git-wip-us.apache.org/repos/asf/incubator-tez.git" />
      <item name="Git (Read-only)" href="git://git.apache.org/incubator-tez.git" alt="Use git clone git://git.apache.org/incubator-tez.git" />
    </menu>

    <footer>
      <div class="row span12">
        Apache Tez, Apache, the Apache feather logo, and the Apache Tez project logos are trademarks of The Apache Software Foundation.
        All other marks mentioned may be trademarks or registered trademarks of their respective owners.
      </div>
      <br/>
      <div class="row span12">
        <a href="privacy-policy.html">Privacy Policy</a>
      </div>
    </footer>

  </body>
</project>
