<!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>
  <head>
    <title>Apache BookKeeper - Privacy Policy</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Bootstrap -->
    <link href="/archives/css/bootstrap.min.css" rel="stylesheet">
    <link href="/archives/css/bootstrap-responsive.min.css" rel="stylesheet">
    <link href="/archives/css/styles.css" rel="stylesheet">
  </head>
  <body>
    <header class="navbar navbar-inverse navbar-static-top" role="banner">
      <div class="container">
    	<div class="navbar-header hidden-xs hidden-sm">
    	  <a class="navbar-brand navbar-logo" href="/archives/"><img class="img-responsive" src="/archives/img/bookkeeper_blk40.png" alt="Bookkeeper Logo" /></a>
    	</div>
    	<div class="navbar-header">
    	  <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
    	  </button>
    	  <a class="navbar-brand" href="/archives/">Apache BookKeeper</a>
    	</div>
    	<nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
    	  <ul class="nav navbar-nav">
    	    <li><a href="/archives/releases.html">Download</a></li>

    	    <li class="dropdown">
    	      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Documentation<span class="caret"></span></a>
    	      <ul class="dropdown-menu" role="menu">
		<li><a href="/archives/docs/master">Latest (master)</a></li>
		<li><ul>
		    <li><a href="/archives/docs/master/apidocs">Java API docs</a></li>
		    <li><a href="/archives/docs/master/bookkeeperTutorial.html">Tutorial</a></li>
		    <li><a href="/archives/docs/master/bookkeeperConfig.html">Admin guide</a></li>
		</ul><li>
                <li><a href="/archives/docs/r4.4.0">Release 4.4.0</a></li>
                <li class="divider"></li>
                <li>Older releases</li>
                <li><a href="/archives/docs/r4.3.2">Release 4.3.2</a></li>
                <li><a href="/archives/docs/r4.3.1">Release 4.3.1</a></li>
                <li><a href="/archives/docs/r4.3.0">Release 4.3.0</a></li>
                <li><a href="/archives/docs/r4.2.4">Release 4.2.4</a></li>
                <li><a href="/archives/docs/r4.2.3">Release 4.2.3</a></li>
                <li><a href="/archives/docs/r4.2.2">Release 4.2.2</a></li>
                <li><a href="/archives/docs/r4.2.1">Release 4.2.1</a></li>
                <li><a href="/archives/docs/r4.2.0">Release 4.2.0</a></li>
                <li><a href="/archives/docs/r4.1.0">Release 4.1.0</a></li>
                <li><a href="/archives/docs/r4.0.0">Release 4.0.0</a></li>
              </ul>
            </li>
            
            <li class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Get Involved<span class="caret"></span></a>
              <ul class="dropdown-menu" role="menu">
                <li><a href="/archives/lists.html">Mailing Lists</a></li>
                <li><a href="/archives/irc.html">IRC</a></li>
                <li><a href="/archives/svn.html">Version Control</a></li>
                <li><a href="https://issues.apache.org/jira/browse/BOOKKEEPER">Issue Tracker</a></li>
              </ul>
            </li>

            <li><a href="https://cwiki.apache.org/confluence/display/BOOKKEEPER/Index">Wiki</a></li>
            <!--<li><a href="#">Hedwig</a></li>//-->
            <li class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Project Info<span class="caret"></span></a>
              <ul class="dropdown-menu" role="menu">
                <li><a href="/archives/credits.html">Who are we?</a></li>
                <li><a href="/archives/bylaws.html">Bylaws</a></li>
                <li><a href="http://www.apache.org/licenses/">License</a></li>
                <li class="divider"></li>
                <li><a href="/archives/privacy.html">Privacy Policy</a></li>
                <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsership</a></li>
                <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
              </ul>
            </li>
          </ul>
          <script>
            (function() {
            var cx = '017580107654524087317:iqnsyimpydg';
            var gcse = document.createElement('script');
            gcse.type = 'text/javascript';
            gcse.async = true;
            gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
            '//www.google.com/cse/cse.js?cx=' + cx;
            var s = document.getElementsByTagName('script')[0];
            s.parentNode.insertBefore(gcse, s);
            })();
          </script>
          
          <div class="navbar-form navbar-right visible-lg" id="googlebox">
            <gcse:searchbox-only></gcse:searchbox-only>
          </div>
        </nav>
      </div>
    </header>
    <div class="container">

 <h1>Privacy Policy</h1>

<p>Information about your use of this website is collected using server access logs and a tracking cookie. The collected information consists of the following:</p>

<ol>
<li>The IP address from which you access the website;</li>
<li>The type of browser and operating system you use to access our site;</li>
<li>The date and time you access our site;</li>
<li>The pages you visit; and</li>
<li>The addresses of pages from where you followed a link to our site.</li>
</ol>

<p>Part of this information is gathered using a tracking cookie set by the <a href="http://www.google.com/analytics/">Google Analytics</a> service and handled by Google as described in their <a href="http://www.google.com/privacy.html">privacy policy</a>. See your browser documentation for instructions on how to disable the cookie if you prefer not to share this data with Google.</p>

<p>We use the gathered information to help us make our site more useful to visitors and to better understand how and when our site is used. We do not track or collect personally identifiable information or associate gathered data with any personally identifying information from other sources.</p>

<p>By using this website, you consent to the collection of this data in the manner and for the purpose described above.</p>

    </div>
    <footer class="footer">
      <div class="container">
        <p class="text-muted">Copyright &copy; 2014 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.<br/>
	Apache BookKeeper, BookKeeper, Apache, Apache ZooKeeper, ZooKeeper, the Apache feather logo, and the Apache BookKeeper project logo are trademarks of The Apache Software Foundation.</p>
      </div>
    </footer>

    <script src="//code.jquery.com/jquery.js"></script>
    <script src="/archives/js/bootstrap.min.js"></script>
  </body>
</html>
