<!--
  ~  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 Apache Zest Community
  </corpauthor>
</authorgroup>

<copyright>
<year>2011</year>
<holder>The Apache Zest 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>

