C.A.P.S. - The Classic Amiga Preservation Society
Freeware License Agreement (License, Copyright and Terms of Use)


ATTENTION: READ CAREFULLY: By using, copying, or distributing the
accompanying software you indicate your acceptance of the following
C.A.P.S. Freeware License Agreement ("Agreement").


PREAMBLE

The C.A.P.S. philosophy dictates that the technology associated with
allowing floppy disk based computer games (C.A.P.S. is not just an
Amiga focused organisation, even though it started out that way) to be
contained in a preservable form should be provided for free (free as
in "free beer"). No profit whatsoever should be made as a result of
this technology with exception of the original copyright holders.

This license enforces this philosophy. It protects against misuse of
a technology that has been a long time in development and is provided
to the Amiga community or anyone else who would like to use it. It also
intends to protect C.A.P.S. itself from possible legal liability.

The C.A.P.S. software should be thought of as an "enabler", a form of
distribution. It is just as a ZIP file, just as an ADF file, just as
your favourite writable CDROM brand. The data or content held by these
files or media is entirely the responsibility of you, the user. If you
do not own the product content then you are likely to be breaking the
license of the content provider or copyright owner. Ultimately, the
C.A.P.S. technology is just an abstract digital recording medium.

You may notice that this license is very strict in pursuit of getting
it into the hands of people who wish to use it for free. You cannot
charge to give it to somebody, not even for media costs. You cannot
have it on a CDROM that is distributed for payment. You cannot use
it as part of providing a service that receives payment in any form.

The only exception where the C.A.P.S. technology may be possibly used
with payment is by an original copyright holder (or appointed body).
They can of course contact C.A.P.S. for a special license for games
they own so long as proof of ownership is provided and such a license
will be restricted to these games. This special license will of course
be provided completely for free.

Infringement of any of the terms of this license is breaching
international copyright laws, but it also hurts the communities
benefiting from the technology by risking its future improvement
and availability. 

This license was not produced for the fun of it, you should note that
only those who could possibly financially or otherwise benefit from the
product are being restricted. Free use (as a user) is not limited, it
is absolutely free and will stay free forever.

If you do not agree with any of the terms in this license for the
Technology then you are obviously free to choose not to use it.

The latest version of this license and libraries can be found on our
site: http://www.caps-project.org.

It is very easy to comply with this license: Do not sell, modify or
abuse the software or images. That's it. Everything else mentioned is
here for those who may not understand these very simple rules. :)


1. CLARIFICATION. The software product and accompanying documentation
   (the program's object code and documentation are collectively
   referred to as the "Technology") is a technology and does not imply
   any restrictions, warranty, license, obligation or any other link or
   association with what it may contain (the data encapsulated by the
   Technology is referred to as the "Content").
   
   Unless otherwise noted, The Classic Amiga Preservation Society
   ("C.A.P.S.") does not hold the copyright of the "Content", the data
   being reproduced, preserved, represented using the Technology. All
   copyright of Content provided using the Technology is held by its
   respective owners. Terms and conditions may apply to the Content
   that do not affect whatsoever the license agreement provided with
   the Technology. 


2. LICENSE. C.A.P.S. hereby grants you (each licensee is addressed as
   "you") a non-exclusive, transferable license to use the Technology
   on the following terms and only for non-profit purposes (see Section
   3 below). You may:

   a. use the Technology on any computer in your possession;

   b. make copies of the Technology; and

   c. distribute the Technology (subject to the requirements of Section
   3 and 4) only in the form originally furnished by C.A.P.S. with no
   modifications whatsoever. However, the Technology may be distributed
   as part of another software product provided that the particular
   distribution that contains the Technology is provided for non-profit
   purposes as defined in Section 3 below. Making or distributing any
   for-profit distributions, versions, revisions or releases of said
   software product that contains the Technology is prohibited.
   

3. LIMITATIONS ON LICENSE. The license granted in Section 2 is subject
   to the following restrictions:

   a. The Technology is to be used only for non-profit purposes unless
   you obtain prior written consent from C.A.P.S. Prohibited for-profit
   and commercial purposes include, but are not limited to:

     (i) Selling, licensing or renting the Technology to third parties
     for a fee (by payment of money or otherwise, whether direct or
     indirect);

     (ii) Using the Technology to provide services or products to others
     for which you are compensated in any manner (by payment of money
     or otherwise, whether direct or indirect), including, without
     limitation, providing support or maintenance for the Technology;

     (iii) Distribution or use from which any form of income is received
     regardless of profits therefrom, or from which any revenue or
     promotional value is received, as well as any distribution to or
     use in a corporate environment.  Use of the Technology to promote
     or support a commercial venture is included in this restriction.

     (iv) Using the Technology to develop a similar application on any
     platform for commercial distribution; or
     
     (v) Using the Technology in any manner that is generally
     competitive with a C.A.P.S. product as defined by C.A.P.S.

   b. Media costs associated with the distribution of the Technology may
   not be recovered. You shall use your best efforts to promptly notify
   C.A.P.S. upon learning of any violation of the above commercial
   restrictions.

   c. On each copy of the Technology you must conspicuously and
   appropriately reproduce this license, copyright notice, and
   disclaimer of warranty; keep intact this Agreement and all notices
   that refer to this Agreement or any absence of warranty (whether
   written or interactively displayed); and give any other recipients
   of the Technology a copy of this Agreement.

   d. You may not modify, combine commercial applications with, or
   otherwise prepare derivative works of the Technology. Derivative
   works are defined as but not limited to:
   
     (i) Alternative support libraries. We are open to porting to other
     platforms, and so third parties doing such is unnecessary and
     violates the terms of this license.
     
     (ii) Alternative tools that operate on files of the format as
     defined by the Technology. This includes but is not limited to:
     mastering tools (tools that enable Content to be written back to
     physical media like a floppy disk). Reproducing Content provided
     through or by the Technology to any other kind of media, such as
     alternative content provider technology (this also covers any kind
     of converter with the intention of extracting the Content to held
     by any other alternate media format that represents the same
     independently working Content). Additions, removals or other
     modification of data contained by the images.

   e. C.A.P.S., in its sole and absolute discretion, may have included
   a portion of the source code or online documentation of the
   Technology. Except for any such portions, you shall not REVERSE
   ENGINEER, DECOMPILE, DISASSEMBLE, OR OTHERWISE REDUCE ANY PORTION OF
   THE TECHNOLOGY TO ANY HUMAN PERCEIVABLE FORM, except to the extent
   this restriction is prohibited by applicable law.
   
   f. Commercial software (as defined in this section 3) may not
   contain any part of the Technology except for that part that is
   defined as the "access API" (the header files that allow interaction
   with the library itself, this is available separately from our site
   and has its own license). This interface to the Technology "library"
   is provided is by us to enable the users of the commercial software
   to benefit from the Technology and still let the commercial software
   comply with this license. In this way, the Technology itself need
   not (and should not) be distributed with a commercial product. The
   user should be advised that he can obtain this missing "plugin" from
   the C.A.P.S. site and that it comes with its own license that is not
   affected in any way by the license covering the commercial product.
   This otherwise does not effect the assertion that the Technology may
   not be used by commercial software as defined by this section 3.
   
   g. No distribution may include the totality or part of the
   Technology (including the Content encapsulated by the technology),
   changed, unchanged, encrypted, archived, in whatever form, unless
   according to the Licence or special agreement with C.A.P.S. This
   Technology, including Content must never be found on any paid-for
   medium.


4. DISTRIBUTION: As used in this Agreement, the term "distribute" (and
   its variants) includes making the Technology available (either
   intentionally or unintentionally) to third parties for copying or
   use, including providing timeshare access. Each time you distribute
   the Technology, the recipient must expressly agree to comply with
   these terms and conditions.  The recipient automatically receives
   this license to use, copy, or distribute the Technology subject to
   these terms and conditions. You may not impose any further
   restrictions on the recipients' exercise of the rights granted
   herein. You are not responsible for enforcing compliance with this
   Agreement by recipients.


5. TITLE. Title, ownership rights, and intellectual property rights in
   and to the Technology, and each copy thereof (including all
   copyrights therein), shall remain in C.A.P.S. The Technology is
   protected by international copyright treaties.


6. NO C.A.P.S. OBLIGATION. You are solely responsible for all of your
   costs and expenses incurred in connection with the distribution of
   the Technology, and C.A.P.S. shall have no liability, obligation or
   responsibility therefor. C.A.P.S. shall have no obligation to
   provide maintenance, support, upgrades or new releases to you or
   to any distributee of the Technology.
   

7. NO WARRANTY. THE SOFTWARE IS LICENSED FREE OF CHARGE, AND THERE IS
   NO WARRANTY FOR THE TECHNOLOGY. C.A.P.S. PROVIDES THE TECHNOLOGY
   "AS IS," AND C.A.P.S., AND ALL OTHER PERSONS WHO HAVE BEEN INVOLVED
   IN THE CREATION, PRODUCTION, OR DELIVERY OF THE TECHNOLOGY, DISCLAIM
   ALL CONDITIONS AND WARRANTIES OF ANY KIND, EITHER EXPRESS, IMPLIED,
   STATUTORY, OR OTHERWISE, INCLUDING, BUT NOT LIMITED TO, ANY
   CONDITIONS OR IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY
   QUALITY, AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO
   THE RESULTS, QUALITY AND PERFORMANCE OF THE TECHNOLOGY IS WITH YOU
   AND YOUR DISTRIBUTEES. SHOULD THE TECHNOLOGY PROVE DEFECTIVE, YOU
   AND YOUR DISTRIBUTEES (AND NOT C.A.P.S.) ASSUME THE COST OF ALL
   NECESSARY SERVICING, REPAIR OR CORRECTION. C.A.P.S. MAKES NO
   WARRANTY OF NONINFRINGEMENT OF THE INTELLECTUAL PROPERTY RIGHTS OF
   THIRD PARTIES.


8. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL
   THEORY, TORT, CONTRACT, OR OTHERWISE, SHALL C.A.P.S., OR ANY OTHER
   PERSON WHO HAS BEEN INVOLVED IN THE CREATION, PRODUCTION, OR
   DELIVERY OF THE TECHNOLOGY BE LIABLE TO YOU OR ANY OTHER PERSON FOR
   ANY GENERAL, DIRECT, INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL,
   OR OTHER DAMAGES OF ANY CHARACTER ARISING OUT OF THIS AGREEMENT OR
   THE USE OF OR INABILITY TO USE THE TECHNOLOGY, INCLUDING BUT NOT
   LIMITED TO PERSONAL INJURY, LOSS OF PROFITS, LOSS OF DATA, OUTPUT
   FROM THE TECHNOLOGY OR DATA BEING RENDERED INACCURATE, FAILURE OF
   THE TECHNOLOGY TO OPERATE WITH ANY OTHER PROGRAMS, DAMAGES FOR LOSS
   OF GOODWILL, BUSINESS INTERRUPTION, COMPUTER FAILURE OR MALFUNCTION,
   OR ANY AND ALL OTHER DAMAGES OR LOSSES OF WHATEVER NATURE, EVEN IF
   C.A.P.S. HAS BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES.


9. INDEMNIFICATION. You and your distributees shall defend, indemnify
   and hold harmless C.A.P.S., and all other persons who have been
   involved in the creation, production, or delivery of the Technology,
   from any claim, demand, liability, damage award, suit, judgement, or
   other legal action (including reasonable attorney's fees) arising
   out of your use, distribution, modification, or duplication of the
   Technology.


10  TERMINATION. The license granted hereunder is effective until
    terminated by C.A.P.S.. You may terminate it at any time by
    destroying the Technology. This license will terminate automatically
    if you fail to comply with the limitations described above. On
    termination, you must destroy all copies of the Technology. The
    termination of your license will not result in the termination of
    the licenses of any distributees who have received rights to the
    Technology through you so long as they are in compliance with the
    provisions of this Agreement.


11. MISCELLANEOUS. This Agreement represents the complete agreement
    concerning this license between the parties and supersedes all
    prior agreements and representations between them. It may not be
    amended. If any provision of this Agreement is held to be
    unenforceable for any reason, this Agreement shall terminate.

    The most current version of this license is kept on the C.A.P.S.
    web site. Due notice shall be given if ever the license changes,
    then all versions of the Technology will be constrained by the
    newer license.
    
    Anything else not covered by this agreement must be agreed with
    us before any action can be taken by any party.

    Address all correspondence regarding this license to:

    C.A.P.S.
    license@caps-project.org


Copyright and Trademark Notices:
--------------------------------
The Technology is Copyright (c) C.A.P.S. 2003. All rights reserved.
The documentation and all computer files are also Copyright
(c) C.A.P.S. 2003. All rights reserved. These rights include but are
not limited to any foreign language translations of the documentation
or the Technology, and all derivative works of both. All other
trademarks are the property of their respective owners.


C.A.P.S.
The Classic Amiga Preservation Society
http://www.caps-project.org
