<!--
  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.
-->
<authorgroup>
  <corpauthor>The Qi4j Community
  </corpauthor>
</authorgroup>

<copyright>
  <year>2011</year>
  <holder>Qi4j Community</holder>
</copyright>

<legalnotice>
  <title>License: Apache License 2.0</title>
  <simpara>This book is presented in open source and licensed through
    Apache License 2.0.
    You are free to copy, distribute, transmit, and/or adapt the work. This license is based upon the following
    conditions:
  </simpara>
  <formalpara>
    <title>Attribution</title>
    <para>You must attribute the work in the manner specified by the
      author or licensor (but not in any way that suggests that they
      endorse you or your use of the work).</para>
  </formalpara>
  <simpara>
    Any of the above conditions can be waived only if you get permission from the copyright holder.
  </simpara>
  <simpara>
    In no way are any of the following rights affected by the license:
  </simpara>
  <itemizedlist>
    <listitem>
      <simpara>
        Your fair dealing or fair use rights
      </simpara>
    </listitem>
    <listitem>
      <simpara>
        The author&#8217;s moral rights
      </simpara>
    </listitem>
    <listitem>
      <simpara>
        Rights other persons may have either in the work itself or in how the work is used, such as publicity or
        privacy rights
      </simpara>
    </listitem>
  </itemizedlist>
  <note>
    <simpara>
      For any reuse or distribution, you must make clear to the others the license terms of this work. The best way
      to do this is with a direct link to this page:
      <ulink url="http://apache.org/licenses/LICENSE-2.0">http://apache.org/licenses/LICENSE-2.0</ulink>
    </simpara>
  </note>
</legalnotice>

