   =========================================================================
   ==  DO NOT PANIC!  This is a draft for discussion purposes only.       ==
   ==  It has not yet been approved. It does not yet apply to any         ==
   ==  software distributed by the Apache Software Foundation.            ==
   ==                                                                     ==
   ==  This TCK version is for use by JSR-defined projects releasing      ==
   ==  an official TCK for a JSR under JSPA 2.5.                          ==
   ====================================+====================================

                               Apache TCK License
                            Version 2.0, March 2004
                        http://www.apache.org/licenses/

   AMENDMENTS

   The Apache TCK License, Version 2.0, consists of the Apache License,
   Version 2.0, with the following Amendments. Exhibit A describes
   how to apply this License to your work.

   I. Additional Definitions for Section 1.

      "Specification" shall mean the one or more current or proposed
      industry standards, developed as part of the Java Community Process,
      that are identified within the copyright notice by title, revision
      label (or date if no label has been assigned), and Uniform Resource
      Identifier.

      "Specification Lead" shall mean the individual or Legal Entity
      owning copyright on the identified Specification(s).

      "Technology Compatibility Kit" (or "TCK") shall mean the suite of
      tests, tools, and documentation made available by the Specification
      Lead that allows an implementor of a Specification to determine if
      their implementation is compliant with that Specification.

   II. Additional condition for Section 5.

      (e) Prior to distributing a Derivative Work, You must remove from
          the Derivative Work any claims that it is the official TCK for
          the Specification(s) and either make no claims that the
          Derivative Work is capable of testing compliance with the
          Specification(s) or clearly indicate that the Derivative Work
          is not the official TCK and passing tests of the Derivative
          Work is not sufficient to pass the TCK.

   III. Additional term.

      10. Passing the TCK. You may use an unmodified, verbatim copy of
          the Work for the purposes of testing an implementation for
          compliance with the Specification; upon completion of the
          tests, the Work will inform the user whether or not the
          implementation tested does "pass the TCK".  You may use a
          modified version of the Work for testing an implementation,
          but such a modified Work cannot test for compliance and
          does not imply that the implementation will pass the TCK
          even if the implementation passes all of its tests.

   END OF AMENDMENTS

   Exhibit A: How to apply the Apache TCK License to your work.

      Note that the TCK license should only be applied to files that
      are specific to the official TCK tests for an identified set of
      Specifications and to the TCK as a whole Work. Software and
      documentation files that are generic utilities or usable for
      testing in general (regardless of TCK status) should not use
      this license, preferably using the plain Apache License instead.

      To apply the Apache TCK License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!) The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache TCK License, Version 2.0 (the "License"),
   as the Technology Compatibility Kit for the following specification:

     [ Widget Interface, revision 5.1
          <http://www.example.com/specs/widget/5.1/> ]

   You may not use this file except in compliance with the License.
   You may obtain a copy of the License files at

       http://www.apache.org/licenses/TCK-LICENSE-2.0
       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.
