=====================
Copyright and License
=====================

Copyright © 2011-2015 University of California, Los Angeles

ndnSIM is licensed under conditions of GNU General Public License version 3.0 or later
with permission to be linked with NS-3 codebase (GPL 2.0).

ndnSIM uses a number of third-party software and libraries, licensed under the following
licenses:

- Boost libraries licensed under conditions of `Boost Software License 1.0`_

- CryptoPP library is licensed under conditions of `Boost Software License 1.0`_

- SQLite is in `public domain <http://www.sqlite.org/copyright.html>`__

- waf build system is licensed under conditions of `BSD license
  <https://github.com/named-data/ndn-cxx/blob/master/waf>`__

- ndn-cxx library licensed under conditions of `GNU LGPL 3.0+
  <https://github.com/named-data/ndn-cxx/blob/master/COPYING.md>`__

- NDN Forwarding Daemon (NFD) licensed under conditions of `GNU GPL 3.0+
  <https://github.com/named-data/NFD/blob/master/COPYING.md>`__
  
ndnSIM also relies on several other third-party libraries with non-GPL compatible
license. These library fall into category of "System Libraries" under GPL license
definitions and are used in accordance with GPL license exception for "System Libraries":

The GPL license is provided below in this file. For more information about these licenses,
see `<http://www.gnu.org/licenses/>`__

.. _Boost Software License 1.0 : http://www.boost.org/users/license.html

----------------------------------------------------------------------------------

GNU GENERAL PUBLIC LICENSE
==========================

Version 3, 29 June 2007
=======================

    Copyright (C) 2007 Free Software Foundation, Inc. http://fsf.org/ Everyone is permitted to copy
    and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble
========

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to
share and change the works. By contrast, the GNU General Public License is intended to guarantee
your freedom to share and change all versions of a program--to make sure it remains free software
for all its users. We, the Free Software Foundation, use the GNU General Public License for most of
our software; it applies also to any other work released this way by its authors. You can apply it
to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses
are designed to make sure that you have the freedom to distribute copies of free software (and
charge for them if you wish), that you receive source code or can get it if you want it, that you
can change the software or use pieces of it in new free programs, and that you know you can do these
things.

To protect your rights, we need to prevent others from denying you these rights or asking you to
surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the
software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass
on to the recipients the same freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the
software, and (2) offer you this License giving you legal permission to copy, distribute and/or
modify it.

For the developers' and authors' protection, the GPL clearly explains that there is no warranty for
this free software. For both users' and authors' sake, the GPL requires that modified versions be
marked as changed, so that their problems will not be attributed erroneously to authors of previous
versions.

Some devices are designed to deny users access to install or run modified versions of the software
inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the
area of products for individuals to use, which is precisely where it is most unacceptable.
Therefore, we have designed this version of the GPL to prohibit the practice for those products. If
such problems arise substantially in other domains, we stand ready to extend this provision to those
domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents
to restrict development and use of software on general-purpose computers, but in those that do, we
wish to avoid the special danger that patents applied to a free program could make it effectively
proprietary. To prevent this, the GPL assures that patents cannot be used to render the program
non-free.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS
====================

0. Definitions.
---------------

*"This License"* refers to version 3 of the GNU General Public License.

*"Copyright"* also means copyright-like laws that apply to other kinds of works, such as
semiconductor masks.

*"The Program"* refers to any copyrightable work licensed under this License. Each licensee is
addressed as *"you"*. *"Licensees"* and "recipients" may be individuals or organizations.

To *"modify"* a work means to copy from or adapt all or part of the work in a fashion requiring
copyright permission, other than the making of an exact copy. The resulting work is called a
*"modified version"* of the earlier work or a work *"based on"* the earlier work.

A *"covered work"* means either the unmodified Program or a work based on the Program.

To *"propagate"* a work means to do anything with it that, without permission, would make you
directly or secondarily liable for infringement under applicable copyright law, except executing it
on a computer or modifying a private copy. Propagation includes copying, distribution (with or
without modification), making available to the public, and in some countries other activities as
well.

To *"convey"* a work means any kind of propagation that enables other parties to make or receive
copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not
conveying.

An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a
convenient and prominently visible feature that (1) displays an appropriate copyright notice, and
(2) tells the user that there is no warranty for the work (except to the extent that warranties are
provided), that licensees may convey the work under this License, and how to view a copy of this
License. If the interface presents a list of user commands or options, such as a menu, a prominent
item in the list meets this criterion.

1. Source Code.
---------------

The *"source code"* for a work means the preferred form of the work for making modifications to it.
*"Object code"* means any non-source form of a work.

A *"Standard Interface"* means an interface that either is an official standard defined by a
recognized standards body, or, in the case of interfaces specified for a particular programming
language, one that is widely used among developers working in that language.

The *"System Libraries"* of an executable work include anything, other than the work as a whole,
that (a) is included in the normal form of packaging a Major Component, but which is not part of
that Major Component, and (b) serves only to enable use of the work with that Major Component, or to
implement a Standard Interface for which an implementation is available to the public in source code
form. A "Major Component", in this context, means a major essential component (kernel, window
system, and so on) of the specific operating system (if any) on which the executable work runs, or a
compiler used to produce the work, or an object code interpreter used to run it.

The *"Corresponding Source"* for a work in object code form means all the source code needed to
generate, install, and (for an executable work) run the object code and to modify the work,
including scripts to control those activities. However, it does not include the work's System
Libraries, or general-purpose tools or generally available free programs which are used unmodified
in performing those activities but which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for the work, and the source code
for shared libraries and dynamically linked subprograms that the work is specifically designed to
require, such as by intimate data communication or control flow between those subprograms and other
parts of the work.

The Corresponding Source need not include anything that users can regenerate automatically from
other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.

2. Basic Permissions.
---------------------

All rights granted under this License are granted for the term of copyright on the Program, and are
irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a covered work is covered by this
License only if the output, given its content, constitutes a covered work. This License acknowledges
your rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not convey, without conditions so long as
your license otherwise remains in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you with facilities for running
those works, provided that you comply with the terms of this License in conveying all material for
which you do not control copyright. Those thus making or running the covered works for you must do
so exclusively on your behalf, under your direction and control, on terms that prohibit them from
making any copies of your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions stated below.
Sublicensing is not allowed; section 10 makes it unnecessary.

3. Protecting Users' Legal Rights From Anti-Circumvention Law.
--------------------------------------------------------------

No covered work shall be deemed part of an effective technological measure under any applicable law
fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid circumvention of technological
measures to the extent such circumvention is effected by exercising rights under this License with
respect to the covered work, and you disclaim any intention to limit operation or modification of
the work as a means of enforcing, against the work's users, your or third parties' legal rights to
forbid circumvention of technological measures.

4. Conveying Verbatim Copies.
-----------------------------

You may convey verbatim copies of the Program's source code as you receive it, in any medium,
provided that you conspicuously and appropriately publish on each copy an appropriate copyright
notice; keep intact all notices stating that this License and any non-permissive terms added in
accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and
give all recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may offer support or
warranty protection for a fee.

5. Conveying Modified Source Versions.
--------------------------------------

You may convey a work based on the Program, or the modifications to produce it from the Program, in
the form of source code under the terms of section 4, provided that you also meet all of these
conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

A compilation of a covered work with other separate and independent works, which are not by their
nature extensions of the covered work, and which are not combined with it such as to form a larger
program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the
compilation and its resulting copyright are not used to limit the access or legal rights of the
compilation's users beyond what the individual works permit. Inclusion of a covered work in an
aggregate does not cause this License to apply to the other parts of the aggregate.

6. Conveying Non-Source Forms.
------------------------------

You may convey a covered work in object code form under the terms of sections 4 and 5, provided that
you also convey the machine-readable Corresponding Source under the terms of this License, in one of
these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

A separable portion of the object code, whose source code is excluded from the Corresponding Source
as a System Library, need not be included in conveying the object code work.

A *"User Product"* is either (1) a *"consumer product"*, which means any tangible personal property
which is normally used for personal, family, or household purposes, or (2) anything designed or sold
for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful
cases shall be resolved in favor of coverage. For a particular product received by a particular
user, "normally used" refers to a typical or common use of that class of product, regardless of the
status of the particular user or of the way in which the particular user actually uses, or expects
or is expected to use, the product. A product is a consumer product regardless of whether the
product has substantial commercial, industrial or non-consumer uses, unless such uses represent the
only significant mode of use of the product.

*"Installation Information"* for a User Product means any methods, procedures, authorization keys,
or other information required to install and execute modified versions of a covered work in that
User Product from a modified version of its Corresponding Source. The information must suffice to
ensure that the continued functioning of the modified object code is in no case prevented or
interfered with solely because modification has been made.

If you convey an object code work under this section in, or with, or specifically for use in, a User
Product, and the conveying occurs as part of a transaction in which the right of possession and use
of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of
how the transaction is characterized), the Corresponding Source conveyed under this section must be
accompanied by the Installation Information. But this requirement does not apply if neither you nor
any third party retains the ability to install modified object code on the User Product (for
example, the work has been installed in ROM).

The requirement to provide Installation Information does not include a requirement to continue to
provide support service, warranty, or updates for a work that has been modified or installed by the
recipient, or for the User Product in which it has been modified or installed. Access to a network
may be denied when the modification itself materially and adversely affects the operation of the
network or violates the rules and protocols for communication across the network.

Corresponding Source conveyed, and Installation Information provided, in accord with this section
must be in a format that is publicly documented (and with an implementation available to the public
in source code form), and must require no special password or key for unpacking, reading or copying.

7. Additional Terms.
--------------------

*"Additional permissions"* are terms that supplement the terms of this License by making exceptions
from one or more of its conditions. Additional permissions that are applicable to the entire Program
shall be treated as though they were included in this License, to the extent that they are valid
under applicable law. If additional permissions apply only to part of the Program, that part may be
used separately under those permissions, but the entire Program remains governed by this License
without regard to the additional permissions.

When you convey a copy of a covered work, you may at your option remove any additional permissions
from that copy, or from any part of it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place additional permissions on
material, added by you to a covered work, for which you have or can give appropriate copyright
permission.

Notwithstanding any other provision of this License, for material you add to a covered work, you may
(if authorized by the copyright holders of that material) supplement the terms of this License with
terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

All other non-permissive additional terms are considered "further restrictions" within the meaning
of section 10. If the Program as you received it, or any part of it, contains a notice stating that
it is governed by this License along with a term that is a further restriction, you may remove that
term. If a license document contains a further restriction but permits relicensing or conveying
under this License, you may add to a covered work material governed by the terms of that license
document, provided that the further restriction does not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you must place, in the relevant
source files, a statement of the additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the form of a separately written
license, or stated as exceptions; the above requirements apply either way.

8. Termination.
---------------

You may not propagate or modify a covered work except as expressly provided under this License. Any
attempt otherwise to propagate or modify it is void, and will automatically terminate your rights
under this License (including any patent licenses granted under the third paragraph of section 11).

However, if you cease all violation of this License, then your license from a particular copyright
holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder fails to notify you of the
violation by some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright
holder notifies you of the violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that copyright holder, and you cure
the violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have
received copies or rights from you under this License. If your rights have been terminated and not
permanently reinstated, you do not qualify to receive new licenses for the same material under
section 10.

9. Acceptance Not Required for Having Copies.
---------------------------------------------

You are not required to accept this License in order to receive or run a copy of the Program.
Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer
transmission to receive a copy likewise does not require acceptance. However, nothing other than
this License grants you permission to propagate or modify any covered work. These actions infringe
copyright if you do not accept this License. Therefore, by modifying or propagating a covered work,
you indicate your acceptance of this License to do so.

10. Automatic Licensing of Downstream Recipients.
-------------------------------------------------

Each time you convey a covered work, the recipient automatically receives a license from the
original licensors, to run, modify and propagate that work, subject to this License. You are not
responsible for enforcing compliance by third parties with this License.

An *"entity transaction"* is a transaction transferring control of an organization, or substantially
all assets of one, or subdividing an organization, or merging organizations. If propagation of a
covered work results from an entity transaction, each party to that transaction who receives a copy
of the work also receives whatever licenses to the work the party's predecessor in interest had or
could give under the previous paragraph, plus a right to possession of the Corresponding Source of
the work from the predecessor in interest, if the predecessor has it or can get it with reasonable
efforts.

You may not impose any further restrictions on the exercise of the rights granted or affirmed under
this License. For example, you may not impose a license fee, royalty, or other charge for exercise
of rights granted under this License, and you may not initiate litigation (including a cross-claim
or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling,
offering for sale, or importing the Program or any portion of it.

11. Patents.
------------

A *"contributor"* is a copyright holder who authorizes use under this License of the Program or a
work on which the Program is based. The work thus licensed is called the contributor's "contributor
version".

A contributor's *"essential patent claims"* are all patent claims owned or controlled by the
contributor, whether already acquired or hereafter acquired, that would be infringed by some manner,
permitted by this License, of making, using, or selling its contributor version, but do not include
claims that would be infringed only as a consequence of further modification of the contributor
version. For purposes of this definition, "control" includes the right to grant patent sublicenses
in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the
contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run,
modify and propagate the contents of its contributor version.

In the following three paragraphs, a "patent license" is any express agreement or commitment,
however denominated, not to enforce a patent (such as an express permission to practice a patent or
covenant not to sue for patent infringement). To "grant" such a patent license to a party means to
make such an agreement or commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of
the work is not available for anyone to copy, free of charge and under the terms of this License,
through a publicly available network server or other readily accessible means, then you must either
(1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the
benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with
the requirements of this License, to extend the patent license to downstream recipients. "Knowingly
relying" means you have actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work in a country, would infringe
one or more identifiable patents in that country that you have reason to believe are valid.

If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate
by procuring conveyance of, a covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of
the covered work, then the patent license you grant is automatically extended to all recipients of
the covered work and works based on it.

A patent license is "discriminatory" if it does not include within the scope of its coverage,
prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that
are specifically granted under this License. You may not convey a covered work if you are a party to
an arrangement with a third party that is in the business of distributing software, under which you
make payment to the third party based on the extent of your activity of conveying the work, and
under which the third party grants, to any of the parties who would receive the covered work from
you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by
you (or copies made from those copies), or (b) primarily for and in connection with specific
products or compilations that contain the covered work, unless you entered into that arrangement, or
that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting any implied license or other
defenses to infringement that may otherwise be available to you under applicable patent law.

12. No Surrender of Others' Freedom.
------------------------------------

If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict
the conditions of this License, they do not excuse you from the conditions of this License. If you
cannot convey a covered work so as to satisfy simultaneously your obligations under this License and
any other pertinent obligations, then as a consequence you may not convey it at all. For example, if
you agree to terms that obligate you to collect a royalty for further conveying from those to whom
you convey the Program, the only way you could satisfy both those terms and this License would be to
refrain entirely from conveying the Program.

13. Use with the GNU Affero General Public License.
---------------------------------------------------

Notwithstanding any other provision of this License, you have permission to link or combine any
covered work with a work licensed under version 3 of the GNU Affero General Public License into a
single combined work, and to convey the resulting work. The terms of this License will continue to
apply to the part which is the covered work, but the special requirements of the GNU Affero General
Public License, section 13, concerning interaction through a network will apply to the combination
as such.

14. Revised Versions of this License.
-------------------------------------

The Free Software Foundation may publish revised and/or new versions of the GNU General Public
License from time to time. Such new versions will be similar in spirit to the present version, but
may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies that a certain
numbered version of the GNU General Public License "or any later version" applies to it, you have
the option of following the terms and conditions either of that numbered version or of any later
version published by the Free Software Foundation. If the Program does not specify a version number
of the GNU General Public License, you may choose any version ever published by the Free Software
Foundation.

If the Program specifies that a proxy can decide which future versions of the GNU General Public
License can be used, that proxy's public statement of acceptance of a version permanently authorizes
you to choose that version for the Program.

Later license versions may give you additional or different permissions. However, no additional
obligations are imposed on any author or copyright holder as a result of your choosing to follow a
later version.

15. Disclaimer of Warranty.
---------------------------

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO
THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU
ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. Limitation of Liability.
----------------------------

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR
ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH
ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

17. Interpretation of Sections 15 and 16.
-----------------------------------------

If the disclaimer of warranty and limitation of liability provided above cannot be given local legal
effect according to their terms, reviewing courts shall apply local law that most closely
approximates an absolute waiver of all civil liability in connection with the Program, unless a
warranty or assumption of liability accompanies a copy of the Program in return for a fee.

# END OF TERMS AND CONDITIONS
-----------------------------

How to Apply These Terms to Your New Programs
=============================================

If you develop a new program, and you want it to be of the greatest possible use to the public, the
best way to achieve this is to make it free software which everyone can redistribute and change
under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of
each source file to most effectively state the exclusion of warranty; and each file should have at
least the "copyright" line and a pointer to where the full notice is found.

::

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in
an interactive mode:

::

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type 'show c' for details.

The hypothetical commands *'show w'* and *'show c'* should show the appropriate parts of the General
Public License. Of course, your program's commands might be different; for a GUI interface, you
would use an "about box".

You should also get your employer (if you work as a programmer) or school, if any, to sign a
"copyright disclaimer" for the program, if necessary. For more information on this, and how to apply
and follow the GNU GPL, see http://www.gnu.org/licenses/.

The GNU General Public License does not permit incorporating your program into proprietary programs.
If your program is a subroutine library, you may consider it more useful to permit linking
proprietary applications with the library. If this is what you want to do, use the GNU Lesser
General Public License instead of this License. But first, please read
http://www.gnu.org/philosophy/why-not-lgpl.html.
