<?php
/**
 * Copyright (c) 2005, 2017, 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *   Denis Roy (Eclipse Foundation) - Initial implementation
 *   Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */
?>

<style>
.html-content {
  border-style: solid;
  border-width: 1px;
  padding: 3px;
  margin: 5px;
}

.html-content h2 {
  margin-top: 0;
  font-size: 120%;
  border-style: none;
  font-size: 120%;
}

.html-content h3 {
  font-size: 110%;
  border-style: none;
}
</style>

<div id="midcolumn">
  <h1>
    <a name="top"></a><?php print $pageTitle; ?></h1>
  <p>
    <em>Abouts</em> contain legal documentation and are maintained in the
    source code repository and subsequently included in builds in <em>Eclipse
      Platform Plug-in and Fragments</em> and other directories. They
    usually contain information about licensing and sometimes also
    information about any use of cryptography. By convention, every
    Eclipse Platform Plug-in and Fragment usually has an <em>About</em>.
  </p>
  <blockquote>
    <p>
      <em>About</em> files are generally only applicable for content that
      that is delivered as <em>Eclipse Platform Plug-ins and Fragments</em>.
      For more information, please see <a
        href="/projects/handbook/#legaldoc">The Eclipse Project Handbook</a>
    </p>
  </blockquote>

  <p>
    All <em>Abouts</em> will be reviewed and approved by the EMO during
    the <a href="/projects/handbook/#release-review">Release Review</a>
    for your project.
  </p>
  <p>
    If you have any questions, please send an email to <a
      href="mailto:license@eclipse.org">license@eclipse.org</a>.
  </p>
  <p>
    There are two <em>About</em> file templates that committers can choose
    from. The <a href="#short">first</a> one is for plug-ins where all of
    the content is to be licensed under the Eclipse Public License (<a
      href="/legal/epl-2.0">EPL</a>). If all the content in an Eclipse
    Platform Plug-in or Fragment, directory or module can be correctly
    licensed under the EPL then this simple (short) template can be used
    without modification.
  </p>
  <p>
    The <a href="#long">second</a> template should be used when at least
    some of the content of the Eclipse Platform Plug-in or Fragment is
    licensed under a license other than the <a href="/legal/epl-2.0">EPL</a>.
    When using this longer template, your <em>Abouts</em> should be
    reviewed and approved by the relevant PMC, who can also assist
    committers with drafting an <em>About</em>.
  </p>
  <p>
    If your project content makes use of Cryptography, please send an
    email to <a href="mailto:license@eclipse.org">license@eclipse.org</a>
    to request assistance in creating the <em>About</em> file.
  </p>

  <h2>
    <a name="short"></a><em>About</em> File Template for EPL 2.0 Content
  </h2>

  <p>
    Here is a relatively simple <a href="epl-2.0/about.html">template
      about.html</a> file that should suffice in most cases where the
    plug-in contains all Eclipse project-produced EPL 2.0 code.
  </p>

  <div class="html-content">
  <?php print getBodyContent('epl-2.0/about.html');?>
  </div>
  
  <p>
    For further information on the use of <em>Abouts</em>, and how these
    files should be included in your software distribution, please read
    the relevant section in the <a
      href="/projects/handbook/#legaldoc-plugins">Legal Documentation for
      Eclipse Platform Plug-ins and Fragments</a> (under the EPL-2.0).
  </p>

  <h2>
    <a name="short-1.0"></a><em>About</em> File Template for EPL 1.0
    Content
  </h2>

  <p>
    Here is a relatively simple <a href="about.html">template about.html</a>
    file that should suffice in most cases where the plug-in contains all
    Eclipse project-produced EPL 1.0 code.
  </p>

  <div class="html-content">
  <?php print getBodyContent('about.html'); ?>
  </div>

  <p>
    For further information on the use of <em>Abouts</em>, and how these
    files should be included in your software distribution, please read
    the relevant section in the <a
      href="../guidetolegaldoc-EPL-1.0.php#Abouts">Guide to Legal
      Documentation under the EPL 1.0</a>.
  </p>

  <h2>
    <a name="long"></a>Third-Party Content <em>About</em> File Template
    for EPL 2.0
  </h2>

  <p>
    Here is an <a href="epl-2.0/longabout.html">template about.html</a>
    file that contains third-party content.
  </p>

  <div class="html-content">
  <?php print getBodyContent('epl-2.0/longabout.html');?>
  </div>

  <h2>
    <a name="long-1.0"></a>Third-Party Content <em>About</em> File
    Template for EPL 1.0
  </h2>

  <p>
    Here is an <a href="longabout.html">template about.html</a> file that
    contains third-party content.
  </p>

  <div class="html-content">
  <?php print getBodyContent('longabout.html'); ?>
  </div>
</div>
<div id="rightcolumn">
  <div class="sideitem">
    <h6>EPL 2.0 Links</h6>
    <ul>
      <li><a href="epl-2.0/about.html"><code>about.html</code> in plain
          HTML</a></li>
      <li><a href="epl-2.0/longabout.html">Third-Party Content <code>about.html</code>
          in plain HTML
      </a></li>
      <li><a href="/projects/handbook/#legaldoc-plugins">Legal
          Documentation for Eclipse Platform Plug-ins and Fragments</a>
        (under the EPL-2.0)</li>
    </ul>
  </div>
  <div class="sideitem">
    <h6>EPL 1.0 Links</h6>
    <ul>
      <li><a href="about.html"><code>about.html</code> in plain HTML</a></li>
      <li><a href="longabout.html">Third-Party Content <code>about.html</code>
          in plain HTML
      </a></li>
      <li><a href="../guidetolegaldoc-EPL-1.0.php#Abouts">Guide to the
          Legal Documentation for Eclipse Plug-ins and Features under the
          EPL-1.0</a></li>
    </ul>
  </div>
</div>