<?php
/**
 * Copyright (c) 2005, 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
 */
?>
<div id="midcolumn">
  <h1><?php print $pageTitle; ?></h1>
  <p>8th September, 2004</p>
  <p>
    <strong>As of February 11, 2011 this agreement was superseded by the revised
      <a href="epl/notice.php">Eclipse Foundation Software User Agreement</a>.
    </strong>
  </p>
  <p>
    The Eclipse Foundation makes available the Eclipse Update Manager
    (&quot;Update Manager&quot;) for the purpose of allowing users to install
    software, documentation, information and/or other materials (collectively
    &quot;Downloadable Features&quot;). A Downloadable Feature is a bundle of
    Plug-ins and/or Fragments and related materials. This capability is provided
    with the intent of allowing users to extend and update the functionality of
    Eclipse-based products. Information about packaging Downloadable Features is
    available at <a
      href="http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-update-home/doc/eclipse_update_packaging.html"
    >
      http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-update-home/doc/eclipse_update_packaging.html</a>
    (&quot;Specification&quot;).
  </p>
  <p>You may make a Downloadable Feature available on a web server (&quot;Update
    Server&quot;) with the intent of allowing other parties to install the
    Downloadable Feature using the Update Manager. By providing a Downloadable
    Feature in such a manner and making it available in accordance with the
    Specification, you acknowledge your agreement to and grant all necessary
    rights to permit the following:</p>
  <blockquote>
    <ol>
      <li>A series of actions may occur (&quot;Update Process&quot;) in which a
        user may execute the Update Manager on a machine (&quot;Target
        Machine&quot;) with the intent of extending and updating the
        functionality of an Eclipse-based product.</li>
      <li>During the Update Process, the Update Manager may interact with your
        Update Server such that a Downloadable Feature or a portion thereof will
        be copied from your Update Server to the Target Machine
        (&quot;Downloaded&quot;) using the Update Manager.</li>
      <li>According to the Specification, you must provide the terms and
        conditions that govern the use of the Downloadable Feature
        (&quot;Feature Update License&quot;) and such Feature Update License
        shall be placed on your Update Server in accordance with the
        Specification. Such Feature Update License must inform the user of the
        terms and conditions that govern the Downloadable Feature.</li>
      <li>The Update Manager will present the Feature Update License so that a
        user may read it and indicate that they agree with the terms and
        conditions of that license. Upon such indication of agreement by the
        user, the Update Manager will complete installation of the Downloadable
        Feature.</li>
      <li>If you provide a Downloadable Feature (&quot;Top-Level Feature&quot;)
        that &quot;includes&quot; other Downloadable Features (&quot;Included
        Features&quot;) according to the Specification, any installation of the
        Top-Level Feature by the Update Manager will present only the Feature
        Update License for the Top-Level Feature and upon the user indicating
        their agreement of that license&rsquo;s terms and conditions, both the
        Top-Level Feature and the Included Features will be installed as
        described above. It is your obligation to ensure that the Feature Update
        License for the Top-Level Feature includes the terms and conditions that
        apply to any and all Included Features or tells the user where to find
        the Feature Update Licenses that apply to the Included Features.</li>
    </ol>
  </blockquote>
</div>