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

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache 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 License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       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.

===================================================================================
The Apache Airavata distribution includes a number of run time 
dependencies with separate copyright notices and license terms. Your use of the
Apache Airavata code is subject to the terms and conditions of the following licenses.
===================================================================================

===============================================================================
The following components come under Apache Software License 2.0
===============================================================================

apache axiom, apache axis2, apache commons, apache derby, apache geronimo,
apache httpcore components, apache log4j, apache xmlbeans, apache xmlschema,
aws-java-sdk-1.1.8.jar, bcel-5.1.jar, Codehaus Jackson (jackson-core-asl-1.9.2.jar,
jackson-jaxrs-1.9.2.jar, jackson-mapper-asl-1.9.2.jar, jackson-xc-1.9.2.jar, 
jets3t-0.8.0.jar, jettison-1.0-RC2.jar, neethi-2.0.4.jar, PDFBox libraries 
(pdfbox, jempbox, fontbox), wstx-asl-3.2.4.jar

===============================================================================
The following components use Apache based Licenses
===============================================================================

===============================================================================
For: jdom-1.0.jar
    Containing Project URL: http://www.jdom.org/
/*-- 

 $Id: LICENSE.txt,v 1.11 2004/02/06 09:32:57 jhunter Exp $

 Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
 are met:
 
 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions, and the following disclaimer.
 
 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions, and the disclaimer that follows 
    these conditions in the documentation and/or other materials 
    provided with the distribution.

 3. The name "JDOM" must not be used to endorse or promote products
    derived from this software without prior written permission.  For
    written permission, please contact <request_AT_jdom_DOT_org>.
 
 4. Products derived from this software may not be called "JDOM", nor
    may "JDOM" appear in their name, without prior written permission
    from the JDOM Project Management <request_AT_jdom_DOT_org>.
 
 In addition, we request (but do not require) that you include in the 
 end-user documentation provided with the redistribution and/or in the 
 software itself an acknowledgement equivalent to the following:
     "This product includes software developed by the
      JDOM Project (http://www.jdom.org/)."
 Alternatively, the acknowledgment may be graphical using the logos 
 available at http://www.jdom.org/images/logos.

 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 DISCLAIMED.  IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT
 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 SUCH DAMAGE.

 This software consists of voluntary contributions made by many 
 individuals on behalf of the JDOM Project and was originally 
 created by Jason Hunter <jhunter_AT_jdom_DOT_org> and
 Brett McLaughlin <brett_AT_jdom_DOT_org>.  For more information
 on the JDOM Project, please see <http://www.jdom.org/>. 

 */

===============================================================================

ASM bytecode manipulation library (asm)
    Containing Project URL: http://asm.ow2.org/

    Copyright (c) 2000-2005 INRIA, France Telecom
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.

    3. Neither the name of the copyright holders nor the names of its
       contributors may be used to endorse or promote products derived from
       this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
    THE POSSIBILITY OF SUCH DAMAGE.

===============================================================================

For: cryptix-asn1-versionless.jar, cryptix32-versionless.jar
    Containing Project URL: http://www.cryptix.org/

Cryptix General License

Copyright (c) 1995-2005 The Cryptix Foundation Limited.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

  1. Redistributions of source code must retain the copyright notice,
     this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in
     the documentation and/or other materials provided with the
     distribution.

THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND
CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

===============================================================================
The following components come under Extreme! Lab Software License
===============================================================================

XPP3
    Containing Project URL: http://www.extreme.indiana.edu/xgws/xsoap/xpp/
xsul, xsul5, xutil
    Containing Project URL: http://www.extreme.indiana.edu/xgws/xsul/
wsmg
    Containing Project URL: http://www.extreme.indiana.edu/xgws/messenger/index.html
gpel, weps-beans, pegasuswebservice, mapReduce-service-client, atomixmiser
    Containing Project URL: http://www.extreme.indiana.edu/xgws/
    
Indiana University Extreme! Lab Software License

Version 1.1.1

Copyright (c) 2002 Extreme! Lab, Indiana University. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright notice,
   this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in
   the documentation and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any,
   must include the following acknowledgment:

  "This product includes software developed by the Indiana University
  Extreme! Lab (http://www.extreme.indiana.edu/)."

Alternately, this acknowledgment may appear in the software itself,
if and wherever such third-party acknowledgments normally appear.

4. The names "Indiana Univeristy" and "Indiana Univeristy Extreme! Lab"
must not be used to endorse or promote products derived from this
software without prior written permission. For written permission,
please contact http://www.extreme.indiana.edu/.

5. Products derived from this software may not use "Indiana Univeristy"
name nor may "Indiana Univeristy" appear in their name, without prior
written permission of the Indiana University.

THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHORS, COPYRIGHT HOLDERS OR ITS CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

======================================================================== 
The following components are MIT Licensed 
========================================================================

SLF4J,log4j-over-slf4j, jcl-over-slf4j, slf4j-api,mockito-all-1.8.5,jopt-simple-3.2.jar
    Containing Project URL: http://www.slf4j.org/

Copyright (c) 2004-2008 QOS.ch
 All rights reserved.

 Permission is hereby granted, free  of charge, to any person obtaining
 a  copy  of this  software  and  associated  documentation files  (the
 "Software"), to  deal in  the Software without  restriction, including
 without limitation  the rights to  use, copy, modify,  merge, publish,
 distribute,  sublicense, and/or sell  copies of  the Software,  and to
 permit persons to whom the Software  is furnished to do so, subject to
 the following conditions:

 The  above  copyright  notice  and  this permission  notice  shall  be
 included in all copies or substantial portions of the Software.

 THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
 EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
 MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

========================================================================

For dom4j-1.6.1.jar:
    Containing Project URL: http://dom4j.sourceforge.net/
Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.

Redistribution and use of this software and associated documentation
("Software"), with or without modification, are permitted provided
that the following conditions are met:

1. Redistributions of source code must retain copyright
   statements and notices.  Redistributions must also contain a
   copy of this document.
 
2. Redistributions in binary form must reproduce the
   above copyright notice, this list of conditions and the
   following disclaimer in the documentation and/or other
   materials provided with the distribution.
 
3. The name "DOM4J" must not be used to endorse or promote
   products derived from this Software without prior written
   permission of MetaStuff, Ltd.  For written permission,
   please contact dom4j-info@metastuff.com.
 
4. Products derived from this Software may not be called "DOM4J"
   nor may "DOM4J" appear in their names without prior written
   permission of MetaStuff, Ltd. DOM4J is a registered
   trademark of MetaStuff, Ltd.
 
5. Due credit should be given to the DOM4J Project - 
   http://www.dom4j.org
 
THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.

====================================================================================================

For Bouncy Castle:
    Containing Project URL: http://www.bouncycastle.org/

Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)

Permission iss software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

=======================================================================================================

For: The International Components for Unicode (icu4j-2.6.1.jar)
    Containing Project URL: http://site.icu-project.org/

    Copyright (c) 1995-2009 International Business Machines Corporation
    and others

    All rights reserved.

    Permission is hereby granted, free of charge, to any person obtaining
    a copy of this software and associated documentation files (the
    "Software"), to deal in the Software without restriction, including
    without limitation the rights to use, copy, modify, merge, publish,
    distribute, and/or sell copies of the Software, and to permit persons
    to whom the Software is furnished to do so, provided that the above
    copyright notice(s) and this permission notice appear in all copies
    of the Software and that both the above copyright notice(s) and this
    permission notice appear in supporting documentation.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
    BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
    OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
    WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
    ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
    SOFTWARE.

    Except as contained in this notice, the name of a copyright holder shall
    not be used in advertising or otherwise to promote the sale, use or other
    dealings in this Software without prior written authorization of the
    copyright holder.
    
====================================================================== 
The following components are CDDL based License 
======================================================================

For activation-1.1.jar, jaxb-api-2.1.jar, mail-1.4.jar, junit, 
Servlet Specification 2.5 API (servlet-api-2.5-6.1.14.jar),
Classfish Jasper API (jsp-api-2.1-6.1.14.jar), and
JSP2.1 Jasper implementation from Glassfish (jsp-2.1-6.1.14.jar), 
Jersey from Glassfish (jersey-client-1.13.jar, jersey-core-1.13.jar,
jersey-json-1.13.jar, jersey-multipart-1.13.jar) and JSP2.1 Jasper 
implementation from Glassfish (jsp-2.1-6.1.14.jar),whirr-core-0.7.1.jar, whirr-hadoop-0.7.1.jar:
 
NOTE: jersey is dual licensed (http://jersey.java.net/CDDL+GPL.html), 
Apahce Airavata elects to include jersey in this distribution under the
[CDDLv_1.0] license.

    COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0

    1. Definitions.

    1.1. Contributor means each individual or entity that creates or
    contributes to the creation of Modifications.

    1.2. Contributor Version means the combination of the Original Software,
    prior Modifications used by a Contributor (if any), and the Modifications
    made by that particular Contributor.

    1.3. Covered Software means (a) the Original Software, or
    (b) Modifications, or (c) the combination of files containing Original
    Software with files containing Modifications, in each case including
    portions thereof.

    1.4. Executable means the Covered Software in any form other than Source
    Code.

    1.5. Initial Developer means the individual or entity that first makes
    Original Software available under this License.

    1.6. Larger Work means a work which combines Covered Software or portions
    thereof with code not governed by the terms of this License.

    1.7. License means this document.

    1.8. Licensable means having the right to grant, to the maximum extent
    possible, whether at the time of the initial grant or subsequently
    acquired, any and all of the rights conveyed herein.

    1.9. Modifications means the Source Code and Executable form of any of
    the following: A. Any file that results from an addition to, deletion
    from or modification of the contents of a file containing Original
    Software or previous Modifications; B. Any new file that contains any
    part of the Original Software or previous Modification; or C. Any new
    file that is contributed or otherwise made available under the terms of
    this License.

    1.10. Original Software means the Source Code and Executable form of
    computer software code that is originally released under this License.

    1.11. Patent Claims means any patent claim(s), now owned or hereafter
    acquired, including without limitation, method, process, and apparatus
    claims, in any patent Licensable by grantor.

    1.12. Source Code means (a) the common form of computer software code in
    which modifications are made and (b) associated documentation included in
    or with such code.

    1.13. You (or Your) means an individual or a legal entity exercising
    rights under, and complying with all of the terms of, this License. For
    legal entities, You includes any entity which controls, is controlled by,
    or is under common control with You. For purposes of this definition,
    control means (a) the power, direct or indirect, to cause the direction
    or management of such entity, whether by contract or otherwise, or
    (b) ownership of more than fifty percent (50%) of the outstanding shares
    or beneficial ownership of such entity.

    2. License Grants.

    2.1. The Initial Developer Grant. Conditioned upon Your compliance with
    Section 3.1 below and subject to third party intellectual property
    claims, the Initial Developer hereby grants You a world-wide,
    royalty-free, non-exclusive license:

    (a) under intellectual property rights (other than patent or trademark)
        Licensable by Initial Developer, to use, reproduce, modify, display,
        perform, sublicense and distribute the Original Software (or portions
        thereof), with or without Modifications, and/or as part of a Larger
        Work; and

    (b) under Patent Claims infringed by the making, using or selling of
        Original Software, to make, have made, use, practice, sell, and offer
        for sale, and/or otherwise dispose of the Original Software (or
        portions thereof);

    (c) The licenses granted in Sections 2.1(a) and (b) are effective on the
        date Initial Developer first distributes or otherwise makes the
        Original Software available to a third party under the terms of
        this License;

    (d) Notwithstanding Section 2.1(b) above, no patent license is granted:
        (1) for code that You delete from the Original Software, or (2) for
        infringements caused by: (i) the modification of the Original
        Software, or (ii) the combination of the Original Software with other
        software or devices.

    2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1
    below and subject to third party intellectual property claims, each
    Contributor hereby grants You a world-wide, royalty-free, non-exclusive
    license:

    (a) under intellectual property rights (other than patent or trademark)
        Licensable by Contributor to use, reproduce, modify, display, perform,
        sublicense and distribute the Modifications created by such
        Contributor (or portions thereof), either on an unmodified basis,
        with other Modifications, as Covered Software and/or as part of a
        Larger Work; and

    (b) under Patent Claims infringed by the making, using, or selling of
        Modifications made by that Contributor either alone and/or in
        combination with its Contributor Version (or portions of such
        combination), to make, use, sell, offer for sale, have made, and/or
        otherwise dispose of: (1) Modifications made by that Contributor (or
        portions thereof); and (2) the combination of Modifications made by
        that Contributor with its Contributor Version (or portions of such
        combination).

    (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on
        the date Contributor first distributes or otherwise makes the
        Modifications available to a third party.

    (d) Notwithstanding Section 2.2(b) above, no patent license is granted:
        (1) for any code that Contributor has deleted from the Contributor
        Version; (2) for infringements caused by: (i) third party
        modifications of Contributor Version, or (ii) the combination of
        Modifications made by that Contributor with other software (except
        as part of the Contributor Version) or other devices; or (3) under
        Patent Claims infringed by Covered Software in the absence of
        Modifications made by that Contributor.

    3. Distribution Obligations.

    3.1. Availability of Source Code. Any Covered Software that You distribute
    or otherwise make available in Executable form must also be made available
    in Source Code form and that Source Code form must be distributed only
    under the terms of this License. You must include a copy of this License
    with every copy of the Source Code form of the Covered Software You
    distribute or otherwise make available. You must inform recipients of any
    such Covered Software in Executable form as to how they can obtain such
    Covered Software in Source Code form in a reasonable manner on or through
    a medium customarily used for software exchange.

    3.2. Modifications. The Modifications that You create or to which You
    contribute are governed by the terms of this License. You represent that
    You believe Your Modifications are Your original creation(s) and/or You
    have sufficient rights to grant the rights conveyed by this License.

    3.3. Required Notices. You must include a notice in each of Your
    Modifications that identifies You as the Contributor of the Modification.
    You may not remove or alter any copyright, patent or trademark notices
    contained within the Covered Software, or any notices of licensing or any
    descriptive text giving attribution to any Contributor or the Initial
    Developer.

    3.4. Application of Additional Terms. You may not offer or impose any
    terms on any Covered Software in Source Code form that alters or restricts
    the applicable version of this License or the recipients rights hereunder.
    You may choose to offer, and to charge a fee for, warranty, support,
    indemnity or liability obligations to one or more recipients of Covered
    Software. However, you may do so only on Your own behalf, and not on
    behalf of the Initial Developer or any Contributor. You must make it
    absolutely clear that any such warranty, support, indemnity or liability
    obligation is offered by You alone, and You hereby agree to indemnify the
    Initial Developer and every Contributor for any liability incurred by the
    Initial Developer or such Contributor as a result of warranty, support,
    indemnity or liability terms You offer.

    3.5. Distribution of Executable Versions. You may distribute the
    Executable form of the Covered Software under the terms of this License or
    under the terms of a license of Your choice, which may contain terms
    different from this License, provided that You are in compliance with the
    terms of this License and that the license for the Executable form does
    not attempt to limit or alter the recipients rights in the Source Code
    form from the rights set forth in this License. If You distribute the
    Covered Software in Executable form under a different license, You must
    make it absolutely clear that any terms which differ from this License
    are offered by You alone, not by the Initial Developer or Contributor.
    You hereby agree to indemnify the Initial Developer and every Contributor
    for any liability incurred by the Initial Developer or such Contributor as
    a result of any such terms You offer.

    3.6. Larger Works. You may create a Larger Work by combining Covered
    Software with other code not governed by the terms of this License and
    distribute the Larger Work as a single product. In such a case, You must
    make sure the requirements of this License are fulfilled for the Covered
    Software.

    4. Versions of the License.

    4.1. New Versions. Sun Microsystems, Inc. is the initial license steward
    and may publish revised and/or new versions of this License from time to
    time. Each version will be given a distinguishing version number. Except
    as provided in Section 4.3, no one other than the license steward has the
    right to modify this License.

    4.2. Effect of New Versions. You may always continue to use, distribute
    or otherwise make the Covered Software available under the terms of the
    version of the License under which You originally received the Covered
    Software. If the Initial Developer includes a notice in the Original
    Software prohibiting it from being distributed or otherwise made
    available under any subsequent version of the License, You must
    distribute and make the Covered Software available under the terms of
    the version of the License under which You originally received the
    Covered Software. Otherwise, You may also choose to use, distribute or
    otherwise make the Covered Software available under the terms of any
    subsequent version of the License published by the license steward.

    4.3. Modified Versions. When You are an Initial Developer and You want
    to create a new license for Your Original Software, You may create and
    use a modified version of this License if You: (a) rename the license and
    remove any references to the name of the license steward (except to note
    that the license differs from this License); and (b) otherwise make it
    clear that the license contains terms which differ from this License.

    5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE
    ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
    IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED
    SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
    OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
    THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE
    DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER
    CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR
    CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF
    THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER
    EXCEPT UNDER THIS DISCLAIMER.

    6. TERMINATION.

    6.1. This License and the rights granted hereunder will terminate
    automatically if You fail to comply with terms herein and fail to cure
    such breach within 30 days of becoming aware of the breach. Provisions
    which, by their nature, must remain in effect beyond the termination of
    this License shall survive.

    6.2. If You assert a patent infringement claim (excluding declaratory
    judgment actions) against Initial Developer or a Contributor (the Initial
    Developer or Contributor against whom You assert such claim is referred
    to as Participant) alleging that the Participant Software (meaning the
    Contributor Version where the Participant is a Contributor or the
    Original Software where the Participant is the Initial Developer)
    directly or indirectly infringes any patent, then any and all rights
    granted directly or indirectly to You by such Participant, the Initial
    Developer (if the Initial Developer is not the Participant) and all
    Contributors under Sections 2.1 and/or 2.2 of this License shall, upon
    60 days notice from Participant terminate prospectively and automatically
    at the expiration of such 60 day notice period, unless if within such
    60 day period You withdraw Your claim with respect to the Participant
    Software against such Participant either unilaterally or pursuant to a
    written agreement with Participant.

    6.3. In the event of termination under Sections 6.1 or 6.2 above, all end
    user licenses that have been validly granted by You or any distributor
    hereunder prior to termination (excluding licenses granted to You by any
    distributor) shall survive termination.

    7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL
    THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL
    YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
    COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY
    PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF
    ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS,
    LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY
    AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE
    BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
    LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
    RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW
    PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION
    OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION
    AND LIMITATION MAY NOT APPLY TO YOU.

    8. U.S. GOVERNMENT END USERS. The Covered Software is a commercial item,
    as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of
    commercial computer software (as that term is defined at 48 C.F.R.
    252.227-7014(a)(1)) and commercial computer software documentation as such
    terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R.
    12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S.
    Government End Users acquire Covered Software with only those rights set
    forth herein. This U.S. Government Rights clause is in lieu of, and
    supersedes, any other FAR, DFAR, or other clause or provision that
    addresses Government rights in computer software under this License.

    9. MISCELLANEOUS. This License represents the complete agreement
    concerning subject matter hereof. If any provision of this License is
    held to be unenforceable, such provision shall be reformed only to the
    extent necessary to make it enforceable. This License shall be governed
    by the law of the jurisdiction specified in a notice contained within
    the Original Software (except to the extent applicable law, if any,
    provides otherwise), excluding such jurisdictions conflict-of-law
    provisions. Any litigation relating to this License shall be subject to
    the jurisdiction of the courts located in the jurisdiction and venue
    specified in a notice contained within the Original Software, with the
    losing party responsible for costs, including, without limitation, court
    costs and reasonable attorneys fees and expenses. The application of the
    United Nations Convention on Contracts for the International Sale of
    Goods is expressly excluded. Any law or regulation which provides that
    the language of a contract shall be construed against the drafter shall
    not apply to this License. You agree that You alone are responsible for
    compliance with the United States export administration regulations (and
    the export control laws and regulation of any other countries) when You
    use, distribute or otherwise make available any Covered Software.

    10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the
    Contributors, each party is responsible for claims and damages arising,
    directly or indirectly, out of its utilization of rights under this
    License and You agree to work with Initial Developer and Contributors
    to distribute such responsibility on an equitable basis. Nothing herein
    is intended or shall be deemed to constitute any admission of liability.

    NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION
    LICENSE (CDDL) The code released under the CDDL shall be governed by the
    laws of the State of California (excluding conflict-of-law provisions).
    Any litigation relating to this License shall be subject to the
    jurisdiction of the Federal Courts of the Northern District of California
    and the state courts of the State of California, with venue lying in
    Santa Clara County, California.


==============================================================================

For: jaxb-xjc-2.1.7.jar
    Containing Project URL: 

Copyright (c) 2004 Kohsuke Kawaguchi

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall
be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

=============================================================================== 
The following components are BSD Licensed 
=============================================================================== 

For jibx-bind-1.2.1.jar,jibx-run-1.2.1.jar, antlr-2.7.7.jar,hamcrest-all-1.1.jar,whirr-core-0.7.1.jar, whirr-hadoop-0.7.1.jar:
    Containing Project URL: http://jibx.sourceforge.net, http://www.antlr.org/

Copyright (c) 2003-2007, Dennis M. Sosnoski
All rights reserved.

Copyright (c) 2010 Terence Parr
All rights reserved.

[The BSD License]

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

 * Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.
 * Neither the name of JiBX nor the names of its contributors may be used
   to endorse or promote products derived from this software without specific
   prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

==============================================================================

For YFilter:
    Containing Project URL: http://yfilter.cs.umass.edu/

YFilter 1.0 COPYRIGHT, LICENSE and DISCLAIMER

Copyright (c) 2002, 2004, Regents of the University of California All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are
permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice, this
    list of conditions and the following disclaimer in the documentation and/or other
    materials provided with the distribution.
    * Neither the name of the University of California at Berkeley nor the names of
    its contributors may be used to endorse or promote products derived from this
    software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

==========================================================================================
For jaxen-1.1.1.jar:
    Containing Project URL: http://jaxen.codehaus.org/

 Copyright 2003-2006 The Werken Company. All Rights Reserved.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:

  * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

  * Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

  * Neither the name of the Jaxen Project nor the names of its
    contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

=============================================================================== 
The following components are CPL Licensed 
=============================================================================== 

For wsdl4j-1.6.2.jar:
    Containing Project URL: http://sourceforge.net/projects/wsdl4j/

Common Public License Version 1.0

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
1. DEFINITIONS
"Contribution" means:
a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
b) in the case of each subsequent Contributor:
i) changes to the Program, and
ii) additions to the Program;
where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
"Contributor" means any person or entity that distributes the Program.
"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
"Program" means the Contributions distributed in accordance with this Agreement.
"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
2. GRANT OF RIGHTS
a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
3. REQUIREMENTS
A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
a) it complies with the terms and conditions of this Agreement; and
b) its license agreement:
i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
When the Program is made available in source code form:
a) it must be made available under this Agreement; and
b) a copy of this Agreement must be included with each copy of the Program.
Contributors may not remove or alter any copyright notices contained within the Program.
Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
4. COMMERCIAL DISTRIBUTION
Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
5. NO WARRANTY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
6. DISCLAIMER OF LIABILITY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
7. GENERAL
If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.

==========================================================================================
==========================================================================================

For puretls:
    Containing Project URL: 

  This package is a SSLv3/TLS implementation written by Eric Rescorla
   <ekr\@rtfm.com> and licensed by Claymore Systems, Inc.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:
   1. Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
   2. Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
   3. Neither the name of Claymore Systems, Inc. nor the name of Eric
      Rescorla may be used to endorse or promote products derived from this
      software without specific prior written permission.
   THIS SOFTWARE IS PROVIDED BY CLAYMORE SYSTEMS AND CONTRIBUTORS ``AS IS'' AND
   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   SUCH DAMAGE.

==============================================================================

For xml-api,woden-api-1.0M8.jar,woden-impl-dom-1.0M8.jar:
    Containing Project URL: 

For the W3C schema and DTD files in the org.apache.woden.resolver package:

W3C® DOCUMENT LICENSE
http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231

Public documents on the W3C site are provided by the copyright holders under
the following license. By using and/or copying this document, or the W3C
document from which this statement is linked, you (the licensee) agree that
you have read, understood, and will comply with the following terms and
conditions:

Permission to copy, and distribute the contents of this document, or the W3C
document from which this statement is linked, in any medium for any purpose
and without fee or royalty is hereby granted, provided that you include the
following on ALL copies of the document, or portions thereof, that you use:

  1. A link or URL to the original W3C document.
  2. The pre-existing copyright notice of the original author, or if it
     doesn't exist, a notice (hypertext is preferred, but a textual
     representation is permitted) of the form: "Copyright © [$date-of-document]
     World Wide Web Consortium, (Massachusetts Institute of Technology,
     European Research Consortium for Informatics and Mathematics, Keio
     University). All Rights Reserved.
     http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231"
  3. If it exists, the STATUS of the W3C document.

When space permits, inclusion of the full text of this NOTICE should be
provided. We request that authorship attribution be provided in any software,
documents, or other items or products that you create pursuant to the
implementation of the contents of this document, or any portion thereof.

No right to create modifications or derivatives of W3C documents is granted
pursuant to this license. However, if additional requirements (documented in
the Copyright FAQ) are satisfied, the right to create modifications or
derivatives is sometimes granted by the W3C to individuals complying with
those requirements.

THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO
REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT
LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE
FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT
INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.

COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE
PERFORMANCE OR IMPLEMENTATION OF THE CONTENTS THEREOF.

The name and trademarks of copyright holders may NOT be used in advertising
or publicity pertaining to this document or its contents without specific,
written prior permission. Title to copyright in this document will at all
times remain with copyright holders.

This formulation of W3C's notice and license became active on December 31 2002. 
This version removes the copyright ownership notice such that this license can 
be used with materials other than those owned by the W3C, reflects that ERCIM is 
now a host of the W3C, includes references to this specific dated version of the 
license, and removes the ambiguous grant of "use". Otherwise, this version is the 
same as the previous version and is written so as to preserve the Free Software 
Foundation's assessment of GPL compatibility and OSI's certification under the 
Open Source Definition. Please see our Copyright FAQ for common questions about 
using materials from our site, including specific terms and conditions for packages 
like libwww, Amaya, and Jigsaw. Other questions about this notice can be directed 
o site-policy@w3.org.

Joseph Reagle <site-policy@w3.org>
 
Last revised $Id: copyright-software-20021231.html,v 1.11 2004/07/06 16:02:49 slesch Exp $ 

==========================================================================================

XML API library, org.w3c classes (xml-apis)
    Containing Project URL: 

    DOM Java Language Binding:
    http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/java-binding.html

    W3C IPR SOFTWARE NOTICE
    Copyright (C) 2000 World Wide Web Consortium, (Massachusetts Institute of
    Technology, Institut National de Recherche en Informatique et en
    Automatique, Keio University). All Rights Reserved.

    The DOM bindings are published under the W3C Software Copyright Notice
    and License. The software license requires "Notice of any changes or
    modifications to the W3C files, including the date changes were made."
    Consequently, modified versions of the DOM bindings must document that
    they do not conform to the W3C standard; in the case of the IDL binding,
    the pragma prefix can no longer be 'w3c.org'; in the case of the Java
    binding, the package names can no longer be in the 'org.w3c' package.

    Note: The original version of the W3C Software Copyright Notice and
    License could be found at
    http://www.w3.org/Consortium/Legal/copyright-software-19980720

    Copyright (C) 1994-2000 World Wide Web Consortium, (Massachusetts
    Institute of Technology, Institut National de Recherche en Informatique
    et en Automatique, Keio University). All Rights Reserved.
    http://www.w3.org/Consortium/Legal/

    This W3C work (including software, documents, or other related items) is
    being provided by the copyright holders under the following license. By
    obtaining, using and/or copying this work, you (the licensee) agree that
    you have read, understood, and will comply with the following terms and
    conditions:

    Permission to use, copy, and modify this software and its documentation,
    with or without modification, for any purpose and without fee or royalty
    is hereby granted, provided that you include the following on ALL copies
    of the software and documentation or portions thereof, including
    modifications, that you make:

      1. The full text of this NOTICE in a location viewable to users of the
         redistributed or derivative work.

      2. Any pre-existing intellectual property disclaimers, notices, or
         terms and conditions. If none exist, a short notice of the following
         form (hypertext is preferred, text is permitted) should be used
         within the body of any redistributed or derivative code:
         "Copyright (C) [$date-of-software] World Wide Web Consortium,
         (Massachusetts Institute of Technology, Institut National de
         Recherche en Informatique et en Automatique, Keio University).
         All Rights Reserved. http://www.w3.org/Consortium/Legal/"

      3. Notice of any changes or modifications to the W3C files, including
         the date changes were made. (We recommend you provide URIs to the
         location from which the code is derived.)

    THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
    MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
    NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
    PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
    ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.

    COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL
    OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
    DOCUMENTATION.

    The name and trademarks of copyright holders may NOT be used in
    advertising or publicity pertaining to the software without specific,
    written prior permission. Title to copyright in this software and any
    associated documentation will at all times remain with copyright holders.

=============================================================================== 
The following components come under the Eclipse Public 1.0 License 
=============================================================================== 
Eclipse JDT Core (core-3.1.1.jar)

  Eclipse Public License - v 1.0

    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
    PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
    THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

    1. DEFINITIONS

    "Contribution" means:

    a) in the case of the initial Contributor, the initial code and
       documentation distributed under this Agreement, and

    b) in the case of each subsequent Contributor:

       i) changes to the Program, and

       ii) additions to the Program;

       where such changes and/or additions to the Program originate from and
       are distributed by that particular Contributor. A Contribution
       'originates' from a Contributor if it was added to the Program by
       such Contributor itself or anyone acting on such Contributor's behalf.
       Contributions do not include additions to the Program which: (i) are
       separate modules of software distributed in conjunction with the
       Program under their own license agreement, and (ii) are not derivative
       works of the Program.

    "Contributor" means any person or entity that distributes the Program.

    "Licensed Patents " mean patent claims licensable by a Contributor which
    are necessarily infringed by the use or sale of its Contribution alone or
    when combined with the Program.

    "Program" means the Contributions distributed in accordance with this
    Agreement.

    "Recipient" means anyone who receives the Program under this Agreement,
    including all Contributors.

    2. GRANT OF RIGHTS

    a) Subject to the terms of this Agreement, each Contributor hereby grants
       Recipient a non-exclusive, worldwide, royalty-free copyright license to
       reproduce, prepare derivative works of, publicly display, publicly
       perform, distribute and sublicense the Contribution of such
       Contributor, if any, and such derivative works, in source code and
       object code form.

    b) Subject to the terms of this Agreement, each Contributor hereby grants
       Recipient a non-exclusive, worldwide, royalty-free patent license under
       Licensed Patents to make, use, sell, offer to sell, import and
       otherwise transfer the Contribution of such Contributor, if any, in
       source code and object code form. This patent license shall apply to
       the combination of the Contribution and the Program if, at the time
       the Contribution is added by the Contributor, such addition of the
       Contribution causes such combination to be covered by the Licensed
       Patents. The patent license shall not apply to any other combinations
       which include the Contribution. No hardware per se is licensed hereunder.

    c) Recipient understands that although each Contributor grants the
       licenses to its Contributions set forth herein, no assurances are
       provided by any Contributor that the Program does not infringe the
       patent or other intellectual property rights of any other entity. Each
       Contributor disclaims any liability to Recipient for claims brought by
       any other entity based on infringement of intellectual property rights
       or otherwise. As a condition to exercising the rights and licenses
       granted hereunder, each Recipient hereby assumes sole responsibility
       to secure any other intellectual property rights needed, if any. For
       example, if a third party patent license is required to allow Recipient
       to distribute the Program, it is Recipient's responsibility to acquire
       that license before distributing the Program.

    d) Each Contributor represents that to its knowledge it has sufficient
       copyright rights in its Contribution, if any, to grant the copyright
       license set forth in this Agreement.

    3. REQUIREMENTS

    A Contributor may choose to distribute the Program in object code form
    under its own license agreement, provided that:

    a) it complies with the terms and conditions of this Agreement; and

    b) its license agreement:

       i)   effectively disclaims on behalf of all Contributors all warranties
            and conditions, express and implied, including warranties or
            conditions of title and non-infringement, and implied warranties
            or conditions of merchantability and fitness for a particular
            purpose;

       ii)  effectively excludes on behalf of all Contributors all liability
            for damages, including direct, indirect, special, incidental and
            consequential damages, such as lost profits;

       iii) states that any provisions which differ from this Agreement are
            offered by that Contributor alone and not by any other party; and

       iv)  states that source code for the Program is available from such
            Contributor, and informs licensees how to obtain it in a
            reasonable manner on or through a medium customarily used for
            software exchange.

    When the Program is made available in source code form:

    a) it must be made available under this Agreement; and

    b) a copy of this Agreement must be included with each copy of the
       Program.

    Contributors may not remove or alter any copyright notices contained
    within the Program.

    Each Contributor must identify itself as the originator of its
    Contribution, if any, in a manner that reasonably allows subsequent
    Recipients to identify the originator of the Contribution.

    4. COMMERCIAL DISTRIBUTION

    Commercial distributors of software may accept certain responsibilities
    with respect to end users, business partners and the like. While this
    license is intended to facilitate the commercial use of the Program,
    the Contributor who includes the Program in a commercial product offering
    should do so in a manner which does not create potential liability for
    other Contributors. Therefore, if a Contributor includes the Program in
    a commercial product offering, such Contributor ("Commercial Contributor")
    hereby agrees to defend and indemnify every other Contributor
    ("Indemnified Contributor") against any losses, damages and costs
    (collectively "Losses") arising from claims, lawsuits and other legal
    actions brought by a third party against the Indemnified Contributor to
    the extent caused by the acts or omissions of such Commercial Contributor
    in connection with its distribution of the Program in a commercial
    product offering. The obligations in this section do not apply to any
    claims or Losses relating to any actual or alleged intellectual property
    infringement. In order to qualify, an Indemnified Contributor must:
    a) promptly notify the Commercial Contributor in writing of such claim,
    and b) allow the Commercial Contributor to control, and cooperate with
    the Commercial Contributor in, the defense and any related settlement
    negotiations. The Indemnified Contributor may participate in any such
    claim at its own expense.

    For example, a Contributor might include the Program in a commercial
    product offering, Product X. That Contributor is then a Commercial
    Contributor. If that Commercial Contributor then makes performance claims,
    or offers warranties related to Product X, those performance claims and
    warranties are such Commercial Contributor's responsibility alone. Under
    this section, the Commercial Contributor would have to defend claims
    against the other Contributors related to those performance claims and
    warranties, and if a court requires any other Contributor to pay any
    damages as a result, the Commercial Contributor must pay those damages.

    5. NO WARRANTY

    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
    ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
    EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
    CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A
    PARTICULAR PURPOSE. Each Recipient is solely responsible for determining
    the appropriateness of using and distributing the Program and assumes all
    risks associated with its exercise of rights under this Agreement ,
    including but not limited to the risks and costs of program errors,
    compliance with applicable laws, damage to or loss of data, programs or
    equipment, and unavailability or interruption of operations.

    6. DISCLAIMER OF LIABILITY

    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
    ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
    WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
    DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

    7. GENERAL

    If any provision of this Agreement is invalid or unenforceable under
    applicable law, it shall not affect the validity or enforceability of
    the remainder of the terms of this Agreement, and without further action
    by the parties hereto, such provision shall be reformed to the minimum
    extent necessary to make such provision valid and enforceable.

    If Recipient institutes patent litigation against any entity (including
    a cross-claim or counterclaim in a lawsuit) alleging that the Program
    itself (excluding combinations of the Program with other software or
    hardware) infringes such Recipient's patent(s), then such Recipient's
    rights granted under Section 2(b) shall terminate as of the date such
    litigation is filed.

    All Recipient's rights under this Agreement shall terminate if it fails
    to comply with any of the material terms or conditions of this Agreement
    and does not cure such failure in a reasonable period of time after
    becoming aware of such noncompliance. If all Recipient's rights under
    this Agreement terminate, Recipient agrees to cease use and distribution
    of the Program as soon as reasonably practicable. However, Recipient's
    obligations under this Agreement and any licenses granted by Recipient
    relating to the Program shall continue and survive.

    Everyone is permitted to copy and distribute copies of this Agreement,
    but in order to avoid inconsistency the Agreement is copyrighted and may
    only be modified in the following manner. The Agreement Steward reserves
    the right to publish new versions (including revisions) of this Agreement
    from time to time. No one other than the Agreement Steward has the right
    to modify this Agreement. The Eclipse Foundation is the initial Agreement
    Steward. The Eclipse Foundation may assign the responsibility to serve as
    the Agreement Steward to a suitable separate entity. Each new version of
    the Agreement will be given a distinguishing version number. The Program
    (including Contributions) may always be distributed subject to the version
    of the Agreement under which it was received. In addition, after a new
    version of the Agreement is published, Contributor may elect to distribute
    the Program (including its Contributions) under the new version. Except as
    expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
    rights or licenses to the intellectual property of any Contributor under
    this Agreement, whether expressly, by implication, estoppel or otherwise.
    All rights in the Program not expressly granted under this Agreement
    are reserved.

    This Agreement is governed by the laws of the State of New York and the
    intellectual property laws of the United States of America. No party to
    this Agreement will bring a legal action under this Agreement more than
    one year after the cause of action arose. Each party waives its rights to
    a jury trial in any resulting litigation.
    
===============================================================================

Logback library (logback-core, logback-classic)
    Containing Project URL: http://logback.qos.ch/

    Logback: the reliable, generic, fast and flexible logging framework.
    Copyright (C) 1999-2009, QOS.ch. All rights reserved. 

    This program and the accompanying materials are dual-licensed under
    either the terms of the Eclipse Public License v1.0 as published by
    the Eclipse Foundation

      or (per the licensee's choosing)

    under the terms of the GNU Lesser General Public License version 2.1
    as published by the Free Software Foundation.

=============================================================================== 
The following components are in the public domain 
=============================================================================== 

For Sax: http://www.saxproject.org/
    Containing Project URL: http://www.megginson.com/SAX/

This license came from: http://www.megginson.com/SAX/copying.html
  However please note future versions of SAX may be covered
  under http://saxproject.org/?selected=pd


This page is now out of date -- see the new SAX site at
http://www.saxproject.org/ for more up-to-date
releases and other information. Please change your bookmarks.


SAX2 is Free!

I hereby abandon any property rights to SAX 2.0 (the Simple API for
XML), and release all of the SAX 2.0 source code, compiled code, and
documentation contained in this distribution into the Public Domain.
SAX comes with NO WARRANTY or guarantee of fitness for any
purpose.

David Megginson, david@megginson.com
2000-05-05

==========================================================================
 
Metadata extractor library (metadata-extractor)
    Containing Project URL: http://www.drewnoakes.com/code/exif/

    This is public domain software - that is, you can do whatever you want
    with it, and include it software that is licensed under the GNU or the
    BSD license, or whatever other licence you choose, including proprietary
    closed source licenses.  I do ask that you leave this header in tact.

    If you make modifications to this code that you think would benefit the
    wider community, please send me a copy and I'll post it on my site.

    If you make use of this code, I'd appreciate hearing about it.
      metadata_extractor [at] drewnoakes [dot] com
    Latest version of this software kept at
      http://drewnoakes.com/

===============================================================================

Adobe Font Metrics (AFM) for PDF Core 14 Fonts
    Containing Project URL: 

    This file and the 14 PostScript(R) AFM files it accompanies may be used,
    copied, and distributed for any purpose and without charge, with or without
    modification, provided that all copyright notices are retained; that the
    AFM files are not distributed without this file; that all modifications
    to this file or any of the AFM files are prominently noted in the modified
    file(s); and that this paragraph is not modified. Adobe Systems has no
    responsibility or obligation to support the use of the AFM files. 

CMaps for PDF Fonts (http://www.adobe.com/devnet/font/#pcfi and
ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/)

    Copyright 1990-2001 Adobe Systems Incorporated.
    All Rights Reserved.

    Patents Pending

    NOTICE: All information contained herein is the property
    of Adobe Systems Incorporated.

    Permission is granted for redistribution of this file
    provided this copyright notice is maintained intact and
    that the contents of this file are not altered in any
    way from its original form.

    PostScript and Display PostScript are trademarks of
    Adobe Systems Incorporated which may be registered in
    certain jurisdictions.

================================================================================

Glyphlist (http://www.adobe.com/devnet/opentype/archives/glyph.html)
    Containing Project URL: 

    Copyright (c) 1997,1998,2002,2007 Adobe Systems Incorporated

    Permission is hereby granted, free of charge, to any person obtaining a
    copy of this documentation file to use, copy, publish, distribute,
    sublicense, and/or sell copies of the documentation, and to permit
    others to do the same, provided that:
    - No modification, editing or other alteration of this document is
    allowed; and
    - The above copyright notice and this permission notice shall be
    included in all copies of the documentation.
 
    Permission is hereby granted, free of charge, to any person obtaining a
    copy of this documentation file, to create their own derivative works
    from the content of this document to use, copy, publish, distribute,
    sublicense, and/or sell the derivative works, and to permit others to do
    the same, provided that the derived work is not represented as being a
    copy or version of this document.
 
    Adobe shall not be liable to any party for any loss of revenue or profit
    or for indirect, incidental, special, consequential, or other similar
    damages, whether based on tort (including without limitation negligence
    or strict liability), contract or other legal or equitable grounds even
    if Adobe has been advised or had reason to know of the possibility of
    such damages. The Adobe materials are provided on an "AS IS" basis.
    Adobe specifically disclaims all express, statutory, or implied
    warranties relating to the Adobe materials, including but not limited to
    those concerning merchantability or fitness for a particular purpose or
    non-infringement of any third party rights regarding the Adobe
    materials.

================================================================================

MIME type information from file-4.26.tar.gz (http://www.darwinsys.com/file/)
    Containing Project URL: 

    Copyright (c) Ian F. Darwin 1986, 1987, 1989, 1990, 1991, 1992, 1994, 1995.
    Software written by Ian F. Darwin and others;
    maintained 1994- Christos Zoulas.

    This software is not subject to any export provision of the United States
    Department of Commerce, and may be exported to any country or planet.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
       notice immediately at the beginning of the file, without modification,
       this list of conditions, and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.

    THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

================================================================================

Concurrent library (concurrent-1.3.4.jar)
    Containing Project URL: 
    http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html 

    All classes are released to the public domain and may be used for any
    purpose whatsoever without permission or acknowledgment. Portions of
    the CopyOnWriteArrayList and ConcurrentReaderHashMap classes are adapted
    from Sun JDK source code. These are copyright of Sun Microsystems, Inc,
    and are used with their kind permission, as described in this license:

    TECHNOLOGY LICENSE FROM SUN MICROSYSTEMS, INC. TO DOUG LEA

    Whereas Doug Lea desires to utlized certain Java Software technologies
    in the util.concurrent technology; and Whereas Sun Microsystems, Inc.
    ("Sun") desires that Doug Lea utilize certain Java Software technologies
    in the util.concurrent technology;

    Therefore the parties agree as follows, effective May 31, 2002:

    "Java Software technologies" means

        classes/java/util/ArrayList.java, and
        classes/java/util/HashMap.java.

    The Java Software technologies are Copyright (c) 1994-2000 Sun
    Microsystems, Inc. All rights reserved.

    Sun hereby grants Doug Lea a non-exclusive, worldwide, non-transferrable
    license to use, reproduce, create derivate works of, and distribute the
    Java Software and derivative works thereof in source and binary forms
    as part of a larger work, and to sublicense the right to use, reproduce
    and distribute the Java Software and Doug Lea's derivative works as the
    part of larger works through multiple tiers of sublicensees provided that
    the following conditions are met:

    -Neither the name of or trademarks of Sun may be used to endorse or
    promote products including or derived from the Java Software technology
    without specific prior written permission; and
    -Redistributions of source or binary code must contain the above
    copyright notice, this notice and and the following disclaimers:

    This software is provided "AS IS," without a warranty of any kind.
    ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
    INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
    PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
    MICROSYSTEMS, INC. AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
    SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
    THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN MICROSYSTEMS, INC.
    OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
    DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
    HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
    THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN MICROSYSTEMS, INC.
    HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

    You acknowledge that Software is not designed,licensed or intended for
    use in the design, construction, operation or maintenance of any nuclear
    facility.

=============================================================================

Office Open XML schemas (ooxml-schemas-1.0.jar)
    Containing Project URL: 

    The Office Open XML schema definitions used by Apache POI are
    a part of the Office Open XML ECMA Specification (ECMA-376, [1]).
    As defined in section 9.4 of the ECMA bylaws [2], this specification
    is available to all interested parties without restriction:

        9.4 All documents when approved shall be made available to
            all interested parties without restriction.

    Furthermore, both Microsoft and Adobe have granted patent licenses
    to this work [3,4,5].

    [1] http://www.ecma-international.org/publications/standards/Ecma-376.htm
    [2] http://www.ecma-international.org/memento/Ecmabylaws.htm
    [3] http://www.microsoft.com/interop/osp/
    [4] http://www.ecma-international.org/publications/files/ECMA-ST/Ecma%20PATENT/ECMA-376%20Edition%201%20Microsoft%20Patent%20Declaration.pdf
    [5] http://www.ecma-international.org/publications/files/ECMA-ST/Ecma%20PATENT/ga-2006-191.pdf

==========================================================================================

Unicode conversion code in Lucene Java (lucene-core)

    Copyright 2001-2004 Unicode, Inc.

    Disclaimer

    This source code is provided as is by Unicode, Inc. No claims are
    made as to fitness for any particular purpose. No warranties of any
    kind are expressed or implied. The recipient agrees to determine
    applicability of information provided. If this file has been
    purchased on magnetic or optical media from Unicode, Inc., the
    sole remedy for any claim will be exchange of defective media
    within 90 days of receipt.

    Limitations on Rights to Redistribute This Code

    Unicode, Inc. hereby grants the right to freely use the information
    supplied in this file in the creation of products supporting the
    Unicode Standard, and to make copies of this file in any form
    for internal or external distribution as long as this notice
    remains attached.

==========================================================================================
For jython-2.5.1.jar, Array utility code in Lucene Java (lucene-core):
    Containing Project URL: http://www.jython.org

    PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
    --------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual
 or Organization ("Licensee") accessing and otherwise using this software ("Jython") in source
  or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a 
nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display 
publicly, prepare derivative works, distribute, and otherwise use Jython alone or in any derivative 
version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., 
"Copyright (c) 2007 Python Software Foundation; All Rights Reserved" are retained in Jython alone 
or in any derivative version prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on or incorporates Jython or any part 
thereof, and wants to make the derivative work available to others as provided herein, then Licensee 
hereby agrees to include in any such work a brief summary of the changes made to Jython.

4. PSF is making Jython available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR 
WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS 
ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT 
THE USE OF JYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF JYTHON FOR ANY INCIDENTAL, SPECIAL, 
OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING JYTHON, 
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, 
or joint venture between PSF and Licensee. This License Agreement does not grant permission to use
 PSF trademarks or trade name in a trademark sense to endorse or promote products or services of 
 Licensee, or any third party.

8. By copying, installing or otherwise using Jython, Licensee agrees to be bound by the 
terms and conditions of this License Agreement.

Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met:

Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Jython Developers All rights reserved.

Redistributions of source code must retain the above copyright notice, 
this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this 
list of conditions and the following disclaimer in the documentation and/or other 
materials provided with the distribution.
Neither the name of the Jython Developers nor the names of its contributors 
may be used to endorse or promote products derived from this software 
without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'' 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY 
WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

============================================================================
    
    BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
    -------------------------------------------

    BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

    1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
    office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
    Individual or Organization ("Licensee") accessing and otherwise using
    this software in source or binary form and its associated
    documentation ("the Software").

    2. Subject to the terms and conditions of this BeOpen Python License
    Agreement, BeOpen hereby grants Licensee a non-exclusive,
    royalty-free, world-wide license to reproduce, analyze, test, perform
    and/or display publicly, prepare derivative works, distribute, and
    otherwise use the Software alone or in any derivative version,
    provided, however, that the BeOpen Python License is retained in the
    Software, alone or in any derivative version prepared by Licensee.

    3. BeOpen is making the Software available to Licensee on an "AS IS"
    basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
    IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
    DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
    FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
    INFRINGE ANY THIRD PARTY RIGHTS.

    4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
    SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
    AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
    DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

    5. This License Agreement will automatically terminate upon a material
    breach of its terms and conditions.

    6. This License Agreement shall be governed by and interpreted in all
    respects by the law of the State of California, excluding conflict of
    law provisions.  Nothing in this License Agreement shall be deemed to
    create any relationship of agency, partnership, or joint venture
    between BeOpen and Licensee.  This License Agreement does not grant
    permission to use BeOpen trademarks or trade names in a trademark
    sense to endorse or promote products or services of Licensee, or any
    third party.  As an exception, the "BeOpen Python" logos available at
    http://www.pythonlabs.com/logos.html may be used according to the
    permissions granted on that web page.

    7. By copying, installing or otherwise using the software, Licensee
    agrees to be bound by the terms and conditions of this License
    Agreement.

===========================================================================
    
    CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
    ---------------------------------------

    1. This LICENSE AGREEMENT is between the Corporation for National
    Research Initiatives, having an office at 1895 Preston White Drive,
    Reston, VA 20191 ("CNRI"), and the Individual or Organization
    ("Licensee") accessing and otherwise using Python 1.6.1 software in
    source or binary form and its associated documentation.

    2. Subject to the terms and conditions of this License Agreement, CNRI
    hereby grants Licensee a nonexclusive, royalty-free, world-wide
    license to reproduce, analyze, test, perform and/or display publicly,
    prepare derivative works, distribute, and otherwise use Python 1.6.1
    alone or in any derivative version, provided, however, that CNRI's
    License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
    1995-2001 Corporation for National Research Initiatives; All Rights
    Reserved" are retained in Python 1.6.1 alone or in any derivative
    version prepared by Licensee.  Alternately, in lieu of CNRI's License
    Agreement, Licensee may substitute the following text (omitting the
    quotes): "Python 1.6.1 is made available subject to the terms and
    conditions in CNRI's License Agreement.  This Agreement together with
    Python 1.6.1 may be located on the Internet using the following
    unique, persistent identifier (known as a handle): 1895.22/1013.  This
    Agreement may also be obtained from a proxy server on the Internet
    using the following URL: http://hdl.handle.net/1895.22/1013".

    3. In the event Licensee prepares a derivative work that is based on
    or incorporates Python 1.6.1 or any part thereof, and wants to make
    the derivative work available to others as provided herein, then
    Licensee hereby agrees to include in any such work a brief summary of
    the changes made to Python 1.6.1.

    4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
    basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
    IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
    DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
    FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
    INFRINGE ANY THIRD PARTY RIGHTS.

    5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
    1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
    A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
    OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

    6. This License Agreement will automatically terminate upon a material
    breach of its terms and conditions.

    7. This License Agreement shall be governed by the federal
    intellectual property law of the United States, including without
    limitation the federal copyright law, and, to the extent such
    U.S. federal law does not apply, by the law of the Commonwealth of
    Virginia, excluding Virginia's conflict of law provisions.
    Notwithstanding the foregoing, with regard to derivative works based
    on Python 1.6.1 that incorporate non-separable material that was
    previously distributed under the GNU General Public License (GPL), the
    law of the Commonwealth of Virginia shall govern this License
    Agreement only as to issues arising under or with respect to
    Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
    License Agreement shall be deemed to create any relationship of
    agency, partnership, or joint venture between CNRI and Licensee.  This
    License Agreement does not grant permission to use CNRI trademarks or
    trade name in a trademark sense to endorse or promote products or
    services of Licensee, or any third party.

    8. By clicking on the "ACCEPT" button where indicated, or by copying,
    installing or otherwise using Python 1.6.1, Licensee agrees to be
    bound by the terms and conditions of this License Agreement.

            ACCEPT

============================================================================
    
    CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
    --------------------------------------------------

    Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
    The Netherlands.  All rights reserved.

    Permission to use, copy, modify, and distribute this software and its
    documentation for any purpose and without fee is hereby granted,
    provided that the above copyright notice appear in all copies and that
    both that copyright notice and this permission notice appear in
    supporting documentation, and that the name of Stichting Mathematisch
    Centrum or CWI not be used in advertising or publicity pertaining to
    distribution of the software without specific, written prior
    permission.

    STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
    THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
    FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
    FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
    OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

==============================================================================

JCR 2.0 API (jcr-2.0.jar)

    [Day Specification License]

    Day Management AG ("Licensor") is willing to license this specification
    to you ONLY UPON THE CONDITION THAT YOU ACCEPT ALL OF THE TERMS CONTAINED
    IN THIS LICENSE AGREEMENT ("Agreement"). Please read the terms and
    conditions of this Agreement carefully.

    Content Repository for JavaTM Technology API Specification ("Specification")
    Version: 2.0
    Status: FCS
    Release: 10 August 2009

    Copyright 2009 Day Management AG
    Barfüsserplatz 6, 4001 Basel, Switzerland.
    All rights reserved.

    NOTICE; LIMITED LICENSE GRANTS

    1. License for Purposes of Evaluation and Developing Applications.
    Licensor hereby grants you a fully-paid, non-exclusive, non-transferable,
    worldwide, limited license (without the right to sublicense), under
    Licensor's applicable intellectual property rights to view, download,
    use and reproduce the Specification only for the purpose of internal
    evaluation. This includes developing applications intended to run on an
    implementation of the Specification provided that such applications do
    not themselves implement any portion(s) of the Specification.

    2. License for the Distribution of Compliant Implementations. Licensor
    also grants you a perpetual, non-exclusive, non-transferable, worldwide,
    fully paid-up, royalty free, limited license (without the right to
    sublicense) under any applicable copyrights or, subject to the provisions
    of subsection 4 below, patent rights it may have covering the
    Specification to create and/or distribute an Independent Implementation
    of the Specification that: (a) fully implements the Specification
    including all its required interfaces and functionality; (b) does not
    modify, subset, superset or otherwise extend the Licensor Name Space, or
    include any public or protected packages, classes, Java interfaces, fields
    or methods within the Licensor Name Space other than those
    required/authorized by the Specification or Specifications being
    implemented; and (c) passes the Technology Compatibility Kit (including
    satisfying the requirements of the applicable TCK Users Guide) for such
    Specification ("Compliant Implementation"). In addition, the foregoing
    license is expressly conditioned on your not acting outside its scope.
    No license is granted hereunder for any other purpose (including, for
    example, modifying the Specification, other than to the extent of your
    fair use rights, or distributing the Specification to third parties).

    3. Pass-through Conditions. You need not include limitations (a)-(c) from
    the previous paragraph or any other particular "pass through" requirements
    in any license You grant concerning the use of your Independent
    Implementation or products derived from it. However, except with respect
    to Independent Implementations (and products derived from them) that
    satisfy limitations (a)-(c) from the previous paragraph, You may neither:
    (a) grant or otherwise pass through to your licensees any licenses under
    Licensor's applicable intellectual property rights; nor (b) authorize your
    licensees to make any claims concerning their implementation's compliance
    with the Specification.

    4. Reciprocity Concerning Patent Licenses. With respect to any patent
    claims covered by the license granted under subparagraph 2 above that
    would be infringed by all technically feasible implementations of the
    Specification, such license is conditioned upon your offering on fair,
    reasonable and non-discriminatory terms, to any party seeking it from
    You, a perpetual, non-exclusive, non-transferable, worldwide license
    under Your patent rights that are or would be infringed by all technically
    feasible implementations of the Specification to develop, distribute and
    use a Compliant Implementation.

    5. Definitions. For the purposes of this Agreement: "Independent
    Implementation" shall mean an implementation of the Specification that
    neither derives from any of Licensor's source code or binary code
    materials nor, except with an appropriate and separate license from
    Licensor, includes any of Licensor's source code or binary code materials;
    "Licensor Name Space" shall mean the public class or interface
    declarations whose names begin with "java", "javax", "javax.jcr" or their
    equivalents in any subsequent naming convention adopted by Licensor
    through the Java Community Process, or any recognized successors or
    replacements thereof; and "Technology Compatibility Kit" or "TCK" shall
    mean the test suite and accompanying TCK User's Guide provided by
    Licensor which corresponds to the particular version of the Specification
    being tested.

    6. Termination. This Agreement will terminate immediately without notice
    from Licensor if you fail to comply with any material provision of or act
    outside the scope of the licenses granted above.

    7. Trademarks. No right, title, or interest in or to any trademarks,
    service marks, or trade names of Licensor is granted hereunder. Java is
    a registered trademark of Sun Microsystems, Inc. in the United States and
    other countries.

    8. Disclaimer of Warranties. The Specification is provided "AS IS".
    LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT (INCLUDING AS A
    CONSEQUENCE OF ANY PRACTICE OR IMPLEMENTATION OF THE SPECIFICATION), OR
    THAT THE CONTENTS OF THE SPECIFICATION ARE SUITABLE FOR ANY PURPOSE.
    This document does not represent any commitment to release or implement
    any portion of the Specification in any product.

    The Specification could include technical inaccuracies or typographical
    errors. Changes are periodically added to the information therein; these
    changes will be incorporated into new versions of the Specification, if
    any. Licensor may make improvements and/or changes to the product(s)
    and/or the program(s) described in the Specification at any time. Any
    use of such changes in the Specification will be governed by the
    then-current license for the applicable version of the Specification.

    9. Limitation of Liability. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO
    EVENT WILL LICENSOR BE LIABLE FOR ANY DAMAGES, INCLUDING WITHOUT
    LIMITATION, LOST REVENUE, PROFITS OR DATA, OR FOR SPECIAL, INDIRECT,
    CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
    REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF OR RELATED TO ANY
    FURNISHING, PRACTICING, MODIFYING OR ANY USE OF THE SPECIFICATION, EVEN
    IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

    10. Report. If you provide Licensor with any comments or suggestions in
    connection with your use of the Specification ("Feedback"), you hereby:
    (i) agree that such Feedback is provided on a non-proprietary and
    non-confidential basis, and (ii) grant Licensor a perpetual,
    non-exclusive, worldwide, fully paid-up, irrevocable license, with the
    right to sublicense through multiple levels of sublicensees, to
    incorporate, disclose, and use without limitation the Feedback for any
    purpose related to the Specification and future versions,
    implementations, and test suites thereof.

    [Addendum to the Day Specification License]

    In addition to the permissions granted under the Specification
    License, Day Management AG hereby grants to You a perpetual,
    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    license to reproduce, publicly display, publicly perform,
    sublicense, and distribute unmodified copies of the Content
    Repository for Java Technology API (JCR 2.0) Java Archive (JAR)
    file ("jcr-2.0.jar") and to make, have made, use, offer to sell,
    sell, import, and otherwise transfer said file on its own or
    as part of a larger work that makes use of the JCR API.

    With respect to any patent claims covered by this license
    that would be infringed by all technically feasible implementations
    of the Specification, such license is conditioned upon your
    offering on fair, reasonable and non-discriminatory terms,
    to any party seeking it from You, a perpetual, non-exclusive,
    non-transferable, worldwide license under Your patent rights
    that are or would be infringed by all technically feasible
    implementations of the Specification to develop, distribute
    and use a Compliant Implementation.
================================================================================

APACHE HADOOP SUBCOMPONENTS:

The Apache Hadoop project contains subcomponents with separate copyright
notices and license terms. Your use of the source code for the these
subcomponents is subject to the terms and conditions of the following
licenses. 

For the org.apache.hadoop.util.bloom.* classes:

/**
 *
 * Copyright (c) 2005, European Commission project OneLab under contract
 * 034819 (http://www.one-lab.org)
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or 
 * without modification, are permitted provided that the following 
 * conditions are met:
 *  - Redistributions of source code must retain the above copyright 
 *    notice, this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright 
 *    notice, this list of conditions and the following disclaimer in 
 *    the documentation and/or other materials provided with the distribution.
 *  - Neither the name of the University Catholique de Louvain - UCL
 *    nor the names of its contributors may be used to endorse or 
 *    promote products derived from this software without specific prior 
 *    written permission.
 *    
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE.
 */
=================================================================================

==========================================================================
The following license applies to the whirr-core-0.7.1.jar, whirr-hadoop-0.7.1.jar 
--------------------------------------------------------------------------

Copyright (C) <year> by <copyright holders>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

================================================================================
whirr-core-0.7.1.jar, whirr-hadoop-0.7.1.jar, jsch-0.1.44.jar
================================================================================
Copyright (c) 2002,2003,2004,2005,2006,2007,2008,2009 Atsuhiko Yamanaka, JCraft,Inc. 
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice,
     this list of conditions and the following disclaimer.

  2. Redistributions in binary form must reproduce the above copyright 
     notice, this list of conditions and the following disclaimer in 
     the documentation and/or other materials provided with the distribution.

  3. The names of the authors may not be used to endorse or promote products
     derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

================================================================================

==========================================================================
The following license applies to the whirr-core-0.7.1.jar whirr-hadoop-0.7.1.jar 
--------------------------------------------------------------------------

Copyright (c) 2007-2009, JSR305 expert group
All rights reserved.

http://www.opensource.org/licenses/bsd-license.php

Redistribution and use in source and binary forms, with or without 
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, 
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice, 
      this list of conditions and the following disclaimer in the documentation 
      and/or other materials provided with the distribution.
    * Neither the name of the JSR305 expert group nor the names of its 
      contributors may be used to endorse or promote products derived from 
      this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
POSSIBILITY OF SUCH DAMAGE.

================================================================================

gsabes-client-1.6.0.jar

================================================================================
Copyright (c) 2004-2010
CINECA, Fujitsu Labs Europe, ICM Warsaw, Intel Corporation, 
Research Centre Juelich, University of Manchester, T-Systems,
and other contributors to UNICORE: http://www.unicore.eu

All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

(1) Redistributions of source code must retain the above copyright
    notice, this list of conditions and the disclaimer at the end.
    Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in
    the documentation and/or other materials provided with the
    distribution.

(2) Neither the name of the copyright holders nor the names of their
    contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

DISCLAIMER

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


