 Apache UIMA-DUCC
Copyright 2012 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

Portions of Apache UIMA were originally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant License Agreement", informally known as the
"IBM UIMA License Agreement".
Copyright (c) 2003 IBM Corporation.

Portions of UIMA-DUCC were originally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant License Agreement", informally known as the 
"IBM UIMA-DUCC License Agreement".
Copyright (c) 2012 IBM Corporation

Portions of UIMA-AS were originally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant License Agreement", informally known as the 
"IBM UIMA-EE License Agreement".
Copyright (c) 2007 IBM Corporation

========================================================================= 
------------------ Saxon Notice
========================================================================= 
This product includes software known as 
"The Saxon XSLT and XQuery Processor from Saxonica Limited", whose
home page URL is http://www.saxonica.com/ 

Saxon includes the org.apache.xerces.util.XMLChar module from the Apache 
Xerces product, renamed as net.sf.saxon.om.XMLChar but otherwise unchanged. 
See the copyright statements included in the source code of that module for
conditions of use.

Saxon includes code for performing Unicode normalization that is derived 
from the sample code published for this purpose by the Unicode consortium. 
For the terms of use of this code, see http://www.unicode.org/terms_of_use.html, 
which should be regarded as forming part of these conditions of use, and part 
of the Saxon documentation. 

========================================================================= 
------------------ SVG Notice
========================================================================= 

This product contains icons developed by the SVG Icons project 
(http://sourceforge.net/projects/svgicons), licensed under the 
BSD license (see LICENSE file).


=========================== DUCC IMAGES ================================ 

1. image......... 120px-Anas_platyrhynchos_-United_Kingdom_-adult_female_and_ducklings-8.jpg
   source........ http://commons.wikimedia.org/wiki/File:Anas_platyrhynchos_-United_Kingdom_-adult_female_and_ducklings-8.jpg#metadata
   license....... http://creativecommons.org/licenses/by/2.0/deed.en
   attribution... © jans canon / Wikimedia Commons / CC-BY-2.0
   
2. image......... 120px-Ducks_eating.jpg
   source........ http://commons.wikimedia.org/wiki/File:Ducks_eating.jpg
   license....... http://creativecommons.org/licenses/by/2.0/deed.en
   attribution... © Neil Phillips / Wikimedia Commons / CC-BY-2.0
   
3. image......... 120px-Head_of_a_white_domesticated_duck.jpg
   source........ http://commons.wikimedia.org/wiki/File:Head_of_a_white_domesticated_duck.jpg
   license....... http://creativecommons.org/licenses/by-sa/2.0/deed.en
   attribution... © Ernst Vikne / Wikimedia Commons / CC-BY-SA-2.0   
      
4. image......... 120px-Rubber_duckies_So_many_ducks.jpg
   source........ http://commons.wikimedia.org/wiki/File:Rubber_duckies_So_many_ducks.jpg
   license....... http://creativecommons.org/licenses/by/2.0/deed.en
   attribution... © Gaetan Lee / Wikimedia Commons / CC-BY-2.0   
         
5. image......... 120px-Thermal_image_of_four_ducks_swimming.jpg
   source........ http://commons.wikimedia.org/wiki/File:Thermal_image_of_four_ducks_swimming.jpg
   license....... http://creativecommons.org/publicdomain/zero/1.0/deed.en
   attribution... N/A
          
6. image......... 120px-Tracks_duck.gif
   source........ http://commons.wikimedia.org/wiki/File:Tracks_duck.gif
   license....... This work is in the public domain in the United States because it is a work prepared by an officer or employee of the United States Government
                  as part of that person's official duties under the terms of Title 17, Chapter 1, Section 105 of the US Code. See Copyright.
   attribution... N/A

7. image......... refresh.png
   source........ http://commons.wikimedia.org/wiki/File:Human-gnome-session-reboot.svg
   license....... http://creativecommons.org/licenses/by-sa/2.5/deed.en
   attribution... User:Pander / Wikimedia Commons / CC BY-SA 2.5  
          
8. image......... 144x144Stick_figure_-_choosing.jpg
   source........ http://commons.wikimedia.org/wiki/File:Stick_figure_-_choosing.jpg
   license....... http://creativecommons.org/licenses/by-sa/3.0/deed.en
   attribution... © User:Obsidian Soul / Wikimedia Commons / CC-BY-SA-3.0  
               
9. image......... 2x1.33in-Bariken_kid.JPG
   source........ http://commons.wikimedia.org/wiki/File:Bariken_kid.JPG
   license....... http://creativecommons.org/licenses/by-sa/3.0/deed.en
   attribution... © User:Materialscientist / Wikimedia Commons / CC-BY-SA-3.0  
           
10. image........ 800px-Duck_crossing_Louisiana.2x1.4.jpg
   source........ http://commons.wikimedia.org/wiki/File:Duck_crossing_Louisiana_2010-10-15.JPG
   license....... I, the copyright holder of this work, release this work into the public domain. This applies worldwide.
                  In some countries this may not be legally possible; if so:
                  I grant anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.
   attribution... User:Richard David Ramsey    
      
11. image........ 800px-Leg_Of_White_Duck.2x1.6.jpg
   source........ http://commons.wikimedia.org/wiki/File:Leg_Of_White_Duck.jpg
   license....... http://creativecommons.org/licenses/by-sa/3.0/deed.en
   attribution... © User:Ezhuttukari / Wikimedia Commons / CC-BY-SA-3.0         
            
12. image........ 90px-Swimming_white_domesticated_ducks.jpg
   source........ http://commons.wikimedia.org/wiki/File:Swimming_white_domesticated_ducks.jpg
   license....... http://creativecommons.org/licenses/by-sa/2.0/deed.en
   attribution... © Ernst Vikne / Wikimedia Commons / CC-BY-SA-2.0
         
13. image........ Ducklings_in_Shaw_Creek.jpg
   source........ http://commons.wikimedia.org/wiki/File:Ducklings_in_Shaw_Creek.jpg
   license....... http://creativecommons.org/licenses/by/2.0/deed.en
   attribution... © Author:Peggy2012CREATIVELENZ / Wikimedia Commons / CC-BY-2.0   
         
14. image........ Flying_mallard_duck_-_female_2.0x1.4.jpg
   source........ http://commons.wikimedia.org/wiki/File:Flying_mallard_duck_-_female.jpg
   license....... http://creativecommons.org/licenses/by-sa/3.0/deed.en
   attribution... © Author:Martin Correns / Wikimedia Commons / CC-BY-SA-3.0   

15. image........ indicator.gif
   source........ http://commons.wikimedia.org/wiki/File:Birdleft.gif
   license....... I, the copyright holder of this work, release this work into the public domain. This applies worldwide.
                  In some countries this may not be legally possible; if so:
                  I grant anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.
   attribution... User:Pigpen
    
16. image........ propeller_hat_large.svg.png, propeller_hat_small.svg.png
   source........ http://commons.wikimedia.org/wiki/File:Propeller.svg
   license....... http://creativecommons.org/publicdomain/zero/1.0/deed.en
   attribution... N/A 

17. image........ RCA_Indian_Head_test_pattern.JPG
   source........ http://commons.wikimedia.org/wiki/File:RCA_Indian_Head_test_pattern.JPG
   license....... This work is in the public domain in that it was published in the United States between 1923 and 1977 and without a copyright notice. 
                  Unless its author has been dead for several years, it is copyrighted in jurisdictions that do not apply the rule of the shorter term 
                  for US works, such as Canada (50 p.m.a.), Mainland China (50 p.m.a., not Hong Kong or Macao), Germany (70 p.m.a.), Mexico (100 p.m.a.), 
                  Switzerland (70 p.m.a.), and other countries with individual treaties.
   attribution... N/A
   
18. image........ ts-2.0x1.3.jpeg
   source........ http://commons.wikimedia.org/wiki/File:Mallard_close-up.jpg
   license....... This work has been released into the public domain by its author, Frankyboy5 at the wikipedia project. This applies worldwide.
                  In case this is not legally possible: Frankyboy5 grants anyone the right to use this work for any purpose, without any conditions, unless
                  such conditions are required by law.
   attribution... N/A
      
19. image........ Delena-cancerides-huntsman-spider.jpg
   source........ http://commons.wikimedia.org/wiki/File:Delena-cancerides-huntsman-spider.jpg
   license....... http://creativecommons.org/licenses/by-sa/2.0/deed.en
   attribution... © Bryce McQuillan / Wikimedia Commons / CC-BY-SA-2.0
      
20. image........ 120px-BURROUGH_AUDUBON_SOCIETY_MEMBERS_USE_BINOCULARS_TO_IDENTIFY_MIGRATORY_SHORE_BIRDS_DURING_A_SCHEDULED_OUTING_AT_THE..._-_NARA_-_557179.jpg
   source........ http://commons.wikimedia.org/wiki/File:BURROUGH_AUDUBON_SOCIETY_MEMBERS_USE_BINOCULARS_TO_IDENTIFY_MIGRATORY_SHORE_BIRDS_DURING_A_SCHEDULED_OUTING_AT_THE..._-_NARA_-_557179.jpg
   license....... This work is in the public domain in the United States because it is a work prepared by an officer or employee of the United States Government as part of that person's official 
                  duties under the terms of Title 17, Chapter 1, Section 105 of the US Code. See Copyright.
   attribution... Duncan, Patricia D.
      
21. image........ Cygnet_in_Hyde_Park.jpg
   source........ http://commons.wikimedia.org/wiki/File:Cygnet_in_Hyde_Park.jpg
   license....... http://creativecommons.org/licenses/by-sa/2.0/deed.en
   attribution... Files from Keven Law Flickr stream


==============================================================
 Jetty Web Container
 Copyright 1995-2018 Mort Bay Consulting Pty Ltd.
==============================================================

The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd
unless otherwise noted.

Jetty is dual licensed under both

  * The Apache 2.0 License
    http://www.apache.org/licenses/LICENSE-2.0.html

      and

  * The Eclipse Public 1.0 License
    http://www.eclipse.org/legal/epl-v10.html

Jetty may be distributed under either license.

------
Eclipse

The following artifacts are EPL.
 * org.eclipse.jetty.orbit:org.eclipse.jdt.core

The following artifacts are EPL and ASL2.
 * org.eclipse.jetty.orbit:javax.security.auth.message


The following artifacts are EPL and CDDL 1.0.
 * org.eclipse.jetty.orbit:javax.mail.glassfish


------
Oracle

The following artifacts are CDDL + GPLv2 with classpath exception.
https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html

 * javax.servlet:javax.servlet-api
 * javax.annotation:javax.annotation-api
 * javax.transaction:javax.transaction-api
 * javax.websocket:javax.websocket-api

------
Oracle OpenJDK

If ALPN is used to negotiate HTTP/2 connections, then the following
artifacts may be included in the distribution or downloaded when ALPN
module is selected.

 * java.sun.security.ssl

These artifacts replace/modify OpenJDK classes.  The modififications
are hosted at github and both modified and original are under GPL v2 with
classpath exceptions.
http://openjdk.java.net/legal/gplv2+ce.html


------
OW2

The following artifacts are licensed by the OW2 Foundation according to the
terms of http://asm.ow2.org/license.html

org.ow2.asm:asm-commons
org.ow2.asm:asm


------
Apache

The following artifacts are ASL2 licensed.

org.apache.taglibs:taglibs-standard-spec
org.apache.taglibs:taglibs-standard-impl


------
MortBay

The following artifacts are ASL2 licensed.  Based on selected classes from
following Apache Tomcat jars, all ASL2 licensed.

org.mortbay.jasper:apache-jsp
  org.apache.tomcat:tomcat-jasper
  org.apache.tomcat:tomcat-juli
  org.apache.tomcat:tomcat-jsp-api
  org.apache.tomcat:tomcat-el-api
  org.apache.tomcat:tomcat-jasper-el
  org.apache.tomcat:tomcat-api
  org.apache.tomcat:tomcat-util-scan
  org.apache.tomcat:tomcat-util

org.mortbay.jasper:apache-el
  org.apache.tomcat:tomcat-jasper-el
  org.apache.tomcat:tomcat-el-api


------
Mortbay

The following artifacts are CDDL + GPLv2 with classpath exception.

https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html

org.eclipse.jetty.toolchain:jetty-schemas

------
Assorted

The UnixCrypt.java code implements the one way cryptography used by
Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
modified April 2001  by Iris Van den Broeke, Daniel Deville.
Permission to use, copy, modify and distribute UnixCrypt
for non-commercial or commercial purposes and without fee is
granted provided that the copyright notice appears in all copies.

===============================================
 Cassandra (apache-cassandra-3.11.3.jar)
===============================================
 
Apache Cassandra
Copyright 2009-2014 The Apache Software Foundation

This product includes software developed by The Apache Software
Foundation (http://www.apache.org/).

Some alternate data structures provided by high-scale-lib from
http://sourceforge.net/projects/high-scale-lib/.
Written by Cliff Click and released as Public Domain.

Some alternate data structures provided by concurrentlinkedhashmap
from http://code.google.com/p/concurrentlinkedhashmap/.
Copyright 2009 Benjamin Manes

Alternative collection types provided by google-collections from
http://code.google.com/p/google-collections/.
Copyright (C) 2007 Google Inc.

JSON (de)serialization provided by jackson (http://jackson.codehaus.org).
Copyright (C) 2010 Tatu Saloranta and others.

Alternative JSON (de)serialization by json-simple from
(http://code.google.com/p/json-simple).
Copyright (C) 2009 Fang Yidong and Chris Nokleberg

This product includes the Jetty HTTP server
(http://jetty.codehaus.org/jetty/).
Copyright 1995-2006 Mort Bay Consulting Pty Ltd

YAML support provided by snakeyaml (http://code.google.com/p/snakeyaml/).
Copyright (c) 2008-2010 Andrey Somov

Compression support provided by snappy-java (http://code.google.com/p/snappy-java/)
Written by Taro L. Saito.

Streaming compression support provided by ning-compress
(https://github.com/ning/compress)
Copyright 2009-2010 Ning, Inc.

CQL Native transport uses Netty
(https://netty.io/)
Copyright (C) 2011 The Netty Project

LZ4 compression support provided by lz4-java (http://github.com/jpountz/lz4-java)
Written by Adrien Grand.
Contains bindings to the C LZ4 implementation (http://code.google.com/p/lz4/)
Copyright (C) 2011-2012, Yann Collet.

Alternative Disruptor backed thrift server from https://github.com/xedin/disruptor_thrift_server
Written by Pavel Yaskevich.

LMAX Disruptor
(http://lmax-exchange.github.io/disruptor/)
Copyright 2011 LMAX Ltd.

Airline
(https://github.com/airlift/airline)
Copyright 2011, Dain Sundstrom dain@iq80.com
Copyright 2010, Cedric Beust cedric@beust.com

HLL++ support provided by stream-lib
(https://github.com/addthis/stream-lib)

Eclipse JDT
Java compilation software for user-defined-functions is provided by Eclipse,
which is open source software.  The original software and
related information is available at http://www.eclipse.org/
(http://www.eclipse.org/jdt/)

SIGAR
http://sigar.hyperic.com/

OHC
(https://github.com/snazy/ohc)
Java Off-Heap-Cache, licensed under APLv2
Copyright 2014-2015 Robert Stupp, Germany.

Protocol buffers for varint encoding
https://developers.google.com/protocol-buffers/
Copyright 2008 Google Inc.  All rights reserved.
BSD 3-clause

ASM
(http://asm.ow2.org/)
Copyright (c) 2000-2011 INRIA, France Telecom

HdrHistogram
http://hdrhistogram.org

JCTools
http://jctools.github.io/JCTools/

===============================================
Java Authentication SPI for Containers
Copyright 2003-2009 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

===============================================
Apache Tomcat
Copyright 1999-2014 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

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

=====================================
==== Apache Commons Codec NOTICE
=====================================

Copyright 2002-2011 The Apache Software Foundation

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

--------------------------------------------------------------------------------
src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java contains
test data from http://aspell.sourceforge.net/test/batch0.tab.

Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org). Verbatim copying
and distribution of this entire article is permitted in any medium,
provided this notice is preserved.
--------------------------------------------------------------------------------

========================================================================
Jackson Core (jackson-core-asl-1.9.13.jar)
=========================================================================
This product currently only contains code developed by authors
of specific components, as identified by the source code files;
if such notes are missing files have been created by
Tatu Saloranta.


=========================================================================
Apache Commons Math (commons-math3-3.2.jar)
=========================================================================

Apache Commons Math
Copyright 2001-2013 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

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

The inverse error function implementation in the Erf class is based on CUDA
code developed by Mike Giles, Oxford-Man Institute of Quantitative Finance,
and published in GPU Computing Gems, volume 2, 2010.
===============================================================================

The BracketFinder (package org.apache.commons.math3.optimization.univariate)
and PowellOptimizer (package org.apache.commons.math3.optimization.general)
classes are based on the Python code in module "optimize.py" (version 0.5)
developed by Travis E. Oliphant for the SciPy library (http://www.scipy.org/)
Copyright © 2003-2009 SciPy Developers.
===============================================================================

The LinearConstraint, LinearObjectiveFunction, LinearOptimizer,
RelationShip, SimplexSolver and SimplexTableau classes in package
org.apache.commons.math3.optimization.linear include software developed by
Benjamin McCann (http://www.benmccann.com) and distributed with
the following copyright: Copyright 2009 Google Inc.
===============================================================================

This product includes software developed by the
University of Chicago, as Operator of Argonne National
Laboratory.
The LevenbergMarquardtOptimizer class in package
org.apache.commons.math3.optimization.general includes software
translated from the lmder, lmpar and qrsolv Fortran routines
from the Minpack package
Minpack Copyright Notice (1999) University of Chicago.  All rights reserved
===============================================================================

The GraggBulirschStoerIntegrator class in package
org.apache.commons.math3.ode.nonstiff includes software translated
from the odex Fortran routine developed by E. Hairer and G. Wanner.
Original source copyright:
Copyright (c) 2004, Ernst Hairer
===============================================================================

The EigenDecompositionImpl class in package
org.apache.commons.math3.linear includes software translated
from some LAPACK Fortran routines.  Original source copyright:
Copyright (c) 1992-2008 The University of Tennessee.  All rights reserved.
===============================================================================

The MersenneTwister class in package org.apache.commons.math3.random
includes software translated from the 2002-01-26 version of
the Mersenne-Twister generator written in C by Makoto Matsumoto and Takuji
Nishimura. Original source copyright:
Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
All rights reserved
===============================================================================

The LocalizedFormatsTest class in the unit tests is an adapted version of
the OrekitMessagesTest class from the orekit library distributed under the
terms of the Apache 2 licence. Original source copyright:
Copyright 2010 CS Systèmes d'Information
===============================================================================

The HermiteInterpolator class and its corresponding test have been imported from
the orekit library distributed under the terms of the Apache 2 licence. Original
source copyright:
Copyright 2010-2012 CS Systèmes d'Information
===============================================================================

The creation of the package "o.a.c.m.analysis.integration.gauss" was inspired
by an original code donated by Sébastien Brisard.
===============================================================================



------------------ Jetty (jetty-util) Notice

The UnixCrypt.java code implements the one way cryptography used by
Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
modified April 2001  by Iris Van den Broeke, Daniel Deville.
Permission to use, copy, modify and distribute UnixCrypt
for non-commercial or commercial purposes and without fee is
granted provided that the copyright notice appears in all copies.

=========================================================================
------------------- www.ibatis.com Notice -------
=========================================================================
This product also includes software developed by
Clinton Begin (http://www.ibatis.com).


=========================================================================
==  ActiveMQ Notice                                                      ==
=========================================================================

This product includes software, Apache ActiveMQ, developed
at the Apache Software Foundation (http://www.apache.org/).


=========================================================================
----------- Spring Notice --------------
=========================================================================
This product includes software, Spring Framework developed by
Spring Framework (http://www.springframework.org/).

The end-user documentation included with a redistribution, if any,
must include the following acknowledgement:

 "This product includes software developed by the Spring Framework
  Project (http://www.springframework.org)."

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

The names "Spring" and "Spring Framework" must not be used to
endorse or promote products derived from this software without
prior written permission. For written permission, please contact
rod.johnson@interface21.com or juergen.hoeller@interface21.com.

This product includes software, QDox, developed by
ThoughtWorks, Inc (http://www.thoughtworks.com/).

=========================================================================
------- jaxb-api, jaxb-impl Package Notice ----------
=========================================================================
The jaxb-api, jaxb-impl,javax.servlet is distributed under the 
Common Development and Distribution License v1.0.

You can obtain a copy of the license at
https://glassfish.dev.java.net/public/CDDLv1.0.html.

Source code for jaxb-api, jaxb-impl is at http://jaxb.java.net/

==================================================
==== Apache HttpComponents HttpCore (httpcore-4.4.4.jar)
==================================================

Copyright 2005-2013 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

This project contains annotations derived from JCIP-ANNOTATIONS
Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net

==================================================
=== Servlet 3.0 (geronimo-servlet_3.0_spec-1.0.jar)
==================================================

Copyright 2003-2010 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).



This product includes software developed by
The W3C Consortium (http://www.w3.org/).

Copyright © 1994-2002 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/


=========================================================================
-------- Java Mail 1.4.1 library Notice
=========================================================================
Your use of the Java Mail code is subject to the terms and
conditions of the Common Development and Distribution License (CDDL) Version 1.0. A
copy of the license is available
at https://glassfish.dev.java.net/public/CDDL+GPL.html

The Eclipse Foundation elects to include this software in this distribution 
under the CDDL license.
	
The original source for this javax.mail bundle is available on
the Glassfish website at 
    https://glassfish.dev.java.net/downloads/v2-b58g.html

=========================================================================
---------------------- Mina Notice
=========================================================================
Data compression support is provided by the JZLib library package,
which is open source software, written by JCraft, and copyright
by JCraft.  The original software is available from

   http://www.jcraft.com/jzlib/
   
=========================================================================
-------------------- Joda library Notice
=========================================================================
This product includes software developed by
Joda.org (http://www.joda.org/).

-------------------- xmlbean library Notice

   This product includes software developed by
   The Apache Software Foundation (http://www.apache.org/).

   Portions of this software were originally based on the following:
     - software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

   Aside from contributions to the Apache XMLBeans project, this
   software also includes:

    - one or more source files from the Apache Xerces-J and Apache Axis
      products, Copyright (c) 1999-2003 Apache Software Foundation

    - W3C XML Schema documents Copyright 2001-2003 (c) World Wide Web
      Consortium (Massachusetts Institute of Technology, European Research
      Consortium for Informatics and Mathematics, Keio University)

    - resolver.jar from Apache Xml Commons project,
      Copyright (c) 2001-2003 Apache Software Foundation

    - Piccolo XML Parser for Java from http://piccolo.sourceforge.net/,
      Copyright 2002 Yuval Oren under the terms of the Apache Software License 2.0

    - JSR-173 Streaming API for XML from http://sourceforge.net/projects/xmlpullparser/,
      Copyright 2005 BEA under the terms of the Apache Software License 2.0

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

