Apache NiFi
Copyright 2014-2016 The Apache Software Foundation

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

This product includes the following work from the Apache Hadoop project:

BoundedByteArrayOutputStream.java which was adapted to SoftLimitBoundedByteArrayOutputStream.java

===========================================
Apache Software License v2
===========================================

The following binary components are provided under the Apache Software License v2

  (ASLv2) Apache Commons IO
    The following NOTICE information applies:
      Apache Commons IO
      Copyright 2002-2016 The Apache Software Foundation

  (ASLv2) Apache Commons Net
    The following NOTICE information applies:
      Apache Commons Net
      Copyright 2001-2013 The Apache Software Foundation

  (ASLv2) Apache Commons Collections
    The following NOTICE information applies:
      Apache Commons Collections
      Copyright 2001-2013 The Apache Software Foundation	

  (ASLv2) Apache Commons Compress
    The following NOTICE information applies:
      Apache Commons Compress
      Copyright 2002-2014 The Apache Software Foundation

      The files in the package org.apache.commons.compress.archivers.sevenz
      were derived from the LZMA SDK, version 9.20 (C/ and CPP/7zip/),
      which has been placed in the public domain:

      "LZMA SDK is placed in the public domain." (http://www.7-zip.org/sdk.html)

  (ASLv2) Jettison
    The following NOTICE information applies:
         Copyright 2006 Envoi Solutions LLC

  (ASLv2) Jets3t
    The following NOTICE information applies:

         This product includes software developed by:

         The Apache Software Foundation (http://www.apache.org/).

         The ExoLab Project (http://www.exolab.org/)

         Sun Microsystems (http://www.sun.com/)

         Codehaus (http://castor.codehaus.org)

         Tatu Saloranta (http://wiki.fasterxml.com/TatuSaloranta)

  (ASLv2) Dropwizard Metrics
    The following NOTICE information applies:
	Copyright (c) 2010-2013 Coda Hale, Yammer.com

  (ASLv2) Jasypt
    The following NOTICE information applies:    
	  Copyright (c) 2007-2010, The JASYPT team (http://www.jasypt.org)

  (ASLv2) Apache Commons Codec
    The following NOTICE information applies:
      Apache Commons Codec
      Copyright 2002-2014 The Apache Software Foundation

      src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java
      contains test data from http://aspell.net/test/orig/batch0.tab.
      Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org)

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

      The content of package org.apache.commons.codec.language.bm has been translated
      from the original php source code available at http://stevemorse.org/phoneticinfo.htm
      with permission from the original authors.
      Original source copyright:
      Copyright (c) 2008 Alexander Beider & Stephen P. Morse.

  (ASLv2) Apache HttpComponents
    The following NOTICE information applies:
      Apache HttpClient
      Copyright 1999-2015 The Apache Software Foundation

      Apache HttpCore
      Copyright 2005-2015 The Apache Software Foundation

      Apache HttpMime
      Copyright 1999-2013 The Apache Software Foundation

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

  (ASLv2) Apache Jakarta HttpClient
    The following NOTICE information applies:
      Apache Jakarta HttpClient
      Copyright 1999-2007 The Apache Software Foundation

  (ASLv2) Apache Commons Logging
    The following NOTICE information applies:
      Apache Commons Logging
      Copyright 2003-2014 The Apache Software Foundation

    (ASLv2) Apache Commons VFS
      The following NOTICE information applies:
        Apache Commons VFS
        Copyright 2002-2010 The Apache Software Foundation

    (ASLv2) Apache Commons CSV
      The following NOTICE information applies:
        Apache Commons CSV
        Copyright 2005-2016 The Apache Software Foundation

    (ASLv2) Apache JAMES Mime4j
      The following NOTICE information applies:
       Apache JAMES Mime4j
       Copyright 2004-2010 The Apache Software Foundation

       This product test suite includes data (mimetools-testmsgs folder) developed
       by Eryq and ZeeGee Software Inc as part of the "MIME-tools" Perl5 toolkit
       and licensed under the Artistic License

    (ASLv2) Apache PDFBox
      The following NOTICE information applies:
       Apache PDFBox
       Copyright 2014 The Apache Software Foundation

       Based on source code originally developed in the PDFBox, JempBox and
       FontBox projects.
       Copyright (c) 2002-2007, www.pdfbox.org
       Copyright (c) 2006-2007, www.jempbox.org

       Based on source code originally developed in the PaDaF project.
       Copyright (c) 2010 Atos Worldline SAS

    (ASLv2) Apache XMLBeans
      The following NOTICE information applies:
        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

    (ASLv2) Vorbis Java
      The following NOTICE information applies:
        Ogg and Vorbis Tools for Java
        Copyright 2012 Nick Burch

        The Apache Tika Plugin includes developed at
        The Apache Software Foundation (http://www.apache.org/).

    (ASLv2) Quartz
      The following NOTICE information applies:
        Copyright Declaration:
        Copyright © 2003-2016 Software AG, Darmstadt, Germany and/or Software AG USA Inc., Reston, VA, USA, and/or its subsidiaries and/or its affiliates and/or their licensors.

        Trademark and Patent declaration
        The name Software AG and all Software AG product names are either trademarks or registered trademarks of Software AG and/or Software AG USA Inc. and/or its subsidiaries and/or its affiliates
        and/or their licensors. Other company and product names mentioned herein may be trademarks of their respective owners.

        Detailed information on trademarks and patents owned by Software AG and/or its subsidiaries is located at http://softwareag.com/licenses.

        Third Party declaration
        This software may include portions of third-party products. For third-party copyright notices, license terms, additional rights or restrictions, please refer to "License Texts, Copyright
        Notices and Disclaimers of Third Party Products". For certain specific third-party license restrictions, please refer to section E of the Legal Notices available under "License Terms and
        Conditions for Use of Software AG Products / Copyright and Trademark Notices of Software AG Products". These documents are part of the product documentation, located at
        http://softwareag.com/licenses and/or in the root installation directory of the licensed product(s).

        Confidentiality Disclaimer:
        Use, reproduction, transfer, publication or disclosure is prohibited except as specifically provided for in your License Agreement with Software AG.
        Contact GitHub API Training Shop Blog About

    (ASLv2) JCommander
      The following NOTICE information applies:
        JCommander Copyright Notices
        Copyright 2010 Cedric Beust cedric@beust.com

  (ASLv2) Apache Commons Lang
    The following NOTICE information applies:
      Apache Commons Lang
      Copyright 2001-2015 The Apache Software Foundation

      This product includes software from the Spring Framework,
      under the Apache License 2.0 (see: StringUtils.containsWhitespace())

  (ASLv2) Apache Commons Configuration
    The following NOTICE information applies:
      Apache Commons Configuration
      Copyright 2001-2008 The Apache Software Foundation

  (ASLv2) Apache Commons JEXL
    The following NOTICE information applies:
      Apache Commons JEXL
      Copyright 2001-2011 The Apache Software Foundation

  (ASLv2) Spring Framework
    The following NOTICE information applies:
      Spring Framework 4.1.4.RELEASE
      Copyright (c) 2002-2015 Pivotal, Inc.

  (ASLv2) Spring Security
    The following NOTICE information applies:
          Spring Framework 4.0.3.RELEASE
          Copyright (c) 2002-2015 Pivotal, Inc.

  (ASLv2) Apache Flume
    The following NOTICE information applies:
      Apache Flume
      Copyright 2011-2015 Apache Software Foundation

      asynchbase is BSD-licensed software (https://github.com/OpenTSDB/asynchbase)

      async is BSD-licensed software (https://github.com/stumbleupon/async)

      jopt-simple is MIT licensed software (http://pholser.github.io/jopt-simple/license.html)

      scala-library is BSD-like licensed software (http://www.scala-lang.org/license.html)

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

      Portions of this software was originally based on the following:

        - software copyright (c) 1999-2002, Lotus Development Corporation., http://www.lotus.com.
        - software copyright (c) 2001-2002, Sun Microsystems., http://www.sun.com.
        - software copyright (c) 2003, IBM Corporation., http://www.ibm.com.
        - voluntary contributions made by Ovidiu Predescu (ovidiu@cup.hp.com) on behalf of the 
          Apache Software Foundation and was originally developed at Hewlett Packard Company.

  (ASLv2) Apache XML Commons XML APIs
    Copyright 2006 The Apache Software Foundation.

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

    Portions of this software were originally based on the following:
      - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
      - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
      - software copyright (c) 2000 World Wide Web Consortium, http://www.w3.org

  (ASLv2) IRClib
    The following NOTICE information applies:
      IRClib -- A Java Internet Relay Chat library --
      Copyright (C) 2002 - 2006 Christoph Schwering <schwering@gmail.com>

  (ASLv2) Jackson JSON processor
    The following NOTICE information applies:
      # Jackson JSON processor

      Jackson is a high-performance, Free/Open Source JSON processing library.
      It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
      been in development since 2007.
      It is currently developed by a community of developers, as well as supported
      commercially by FasterXML.com.

      ## Licensing

      Jackson core and extension components may licensed under different licenses.
      To find the details that apply to this artifact see the accompanying LICENSE file.
      For more information, including possible other licensing options, contact
      FasterXML.com (http://fasterxml.com).

      ## Credits

      A list of contributors may be found from CREDITS file, which is included
      in some artifacts (usually source distributions); but is always available
      from the source code management (SCM) system project uses.

  (ASLv2) Apache Thrift
    The following NOTICE information applies:
      Apache Thrift
      Copyright 2006-2010 The Apache Software Foundation.

  (ASLv2) Apache MINA
    The following NOTICE information applies:
      Apache MINA Core
      Copyright 2004-2011 Apache MINA Project

  (ASLv2) opencsv (net.sf.opencsv:opencsv:2.3)

  (ASLv2) Apache Velocity
    The following NOTICE information applies:
      Apache Velocity
      Copyright (C) 2000-2007 The Apache Software Foundation

  (ASLv2) ZkClient
    The following NOTICE information applies:
      ZkClient
      Copyright 2009 Stefan Groschupf

  (ASLv2) Apache Commons CLI
    The following NOTICE information applies:
      Apache Commons CLI
      Copyright 2001-2009 The Apache Software Foundation

  (ASLv2) Apache Commons Math
    The following NOTICE information applies:
      Apache Commons Math
      Copyright 2001-2012 The Apache Software Foundation

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

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

      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.
      ===============================================================================

  (ASLv2) Apache log4j
    The following NOTICE information applies:
      Apache log4j
      Copyright 2007 The Apache Software Foundation

  (ASLv2) Apache Tika
    The following NOTICE information applies:
      Apache Tika
      Copyright 2015 The Apache Software Foundation

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

      Copyright 1993-2010 University Corporation for Atmospheric Research/Unidata
      This software contains code derived from UCAR/Unidata's NetCDF library.

      Tika-server component uses CDDL-licensed dependencies: jersey (http://jersey.java.net/) and
      Grizzly (http://grizzly.java.net/)

      Tika-parsers component uses CDDL/LGPL dual-licensed dependency: jhighlight (https://github.com/codelibs/jhighlight)

      OpenCSV: Copyright 2005 Bytecode Pty Ltd. Licensed under the Apache License, Version 2.0

      IPTC Photo Metadata descriptions Copyright 2010 International Press Telecommunications Council.

  (ASLv2) Apache Jakarta Commons Digester
    The following NOTICE information applies:
      Apache Jakarta Commons Digester
      Copyright 2001-2006 The Apache Software Foundation

  (ASLv2) Apache Commons BeanUtils
    The following NOTICE information applies:
      Apache Commons BeanUtils
      Copyright 2000-2008 The Apache Software Foundation

  (ASLv2) Apache Avro
    The following NOTICE information applies:
      Apache Avro
      Copyright 2009-2013 The Apache Software Foundation

  (ASLv2) Snappy Java
    The following NOTICE information applies:
      This product includes software developed by Google
       Snappy: http://code.google.com/p/snappy/ (New BSD License)
      
      This product includes software developed by Apache
       PureJavaCrc32C from apache-hadoop-common http://hadoop.apache.org/
       (Apache 2.0 license)

      This library containd statically linked libstdc++. This inclusion is allowed by 
      "GCC RUntime Library Exception" 
      http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

  (ASLv2) ApacheDS
    The following NOTICE information applies:
      ApacheDS
      Copyright 2003-2013 The Apache Software Foundation

  (ASLv2) Apache ZooKeeper
    The following NOTICE information applies:
      Apache ZooKeeper
      Copyright 2009-2012 The Apache Software Foundation

  (ASLv2) Apache Commons Daemon
    The following NOTICE information applies:
      Apache Commons Daemon
      Copyright 1999-2013 The Apache Software Foundation

  (ASLv2) Apache Commons EL
    The following NOTICE information applies:
      Apache Commons EL
      Copyright 1999-2007 The Apache Software Foundation

      EL-8 patch - Copyright 2004-2007 Jamie Taylor
      http://issues.apache.org/jira/browse/EL-8

  (ASLv2) Jetty
    The following NOTICE information applies:
       Jetty Web Container
       Copyright 1995-2015 Mort Bay Consulting Pty Ltd.

  (ASLv2) Apache Tomcat
    The following NOTICE information applies:
      Apache Tomcat
      Copyright 2007 The Apache Software Foundation

        Java Management Extensions (JMX) support is provided by
        the MX4J package, which is open source software.  The
        original software and related information is available
        at http://mx4j.sourceforge.net.

        Java compilation software for JSP pages is provided by Eclipse, 
        which is open source software.  The orginal software and 
        related infomation is available at
        http://www.eclipse.org.

  (ASLv2) Apache Kafka
    The following NOTICE information applies:
      Apache Kafka
      Copyright 2012 The Apache Software Foundation.

  (ASLv2) Yammer Metrics
    The following NOTICE information applies:
      Metrics
      Copyright 2010-2012 Coda Hale and Yammer, Inc.

      This product includes software developed by Coda Hale and Yammer, Inc.

      This product includes code derived from the JSR-166 project (ThreadLocalRandom), which was released
      with the following comments:

          Written by Doug Lea with assistance from members of JCP JSR-166
          Expert Group and released to the public domain, as explained at
          http://creativecommons.org/publicdomain/zero/1.0/

  (ASLv2) Apache Lucene
    The following NOTICE information applies:
      Apache Lucene
      Copyright 2014 The Apache Software Foundation

      Includes software from other Apache Software Foundation projects,
      including, but not limited to:
       - Apache Ant
       - Apache Jakarta Regexp
       - Apache Commons
       - Apache Xerces

      ICU4J, (under analysis/icu) is licensed under an MIT styles license
      and Copyright (c) 1995-2008 International Business Machines Corporation and others

      Some data files (under analysis/icu/src/data) are derived from Unicode data such
      as the Unicode Character Database. See http://unicode.org/copyright.html for more
      details.

      Brics Automaton (under core/src/java/org/apache/lucene/util/automaton) is 
      BSD-licensed, created by Anders Møller. See http://www.brics.dk/automaton/

      The levenshtein automata tables (under core/src/java/org/apache/lucene/util/automaton) were
      automatically generated with the moman/finenight FSA library, created by
      Jean-Philippe Barrette-LaPierre. This library is available under an MIT license,
      see http://sites.google.com/site/rrettesite/moman and 
      http://bitbucket.org/jpbarrette/moman/overview/

      The class org.apache.lucene.util.WeakIdentityMap was derived from
      the Apache CXF project and is Apache License 2.0.

      The Google Code Prettify is Apache License 2.0.
      See http://code.google.com/p/google-code-prettify/

      JUnit (junit-4.10) is licensed under the Common Public License v. 1.0
      See http://junit.sourceforge.net/cpl-v10.html

      This product includes code (JaspellTernarySearchTrie) from Java Spelling Checkin
      g Package (jaspell): http://jaspell.sourceforge.net/
      License: The BSD License (http://www.opensource.org/licenses/bsd-license.php)

      The snowball stemmers in
        analysis/common/src/java/net/sf/snowball
      were developed by Martin Porter and Richard Boulton.
      The snowball stopword lists in
        analysis/common/src/resources/org/apache/lucene/analysis/snowball
      were developed by Martin Porter and Richard Boulton.
      The full snowball package is available from
        http://snowball.tartarus.org/

      The KStem stemmer in
        analysis/common/src/org/apache/lucene/analysis/en
      was developed by Bob Krovetz and Sergio Guzman-Lara (CIIR-UMass Amherst)
      under the BSD-license.

      The Arabic,Persian,Romanian,Bulgarian, and Hindi analyzers (common) come with a default
      stopword list that is BSD-licensed created by Jacques Savoy.  These files reside in:
      analysis/common/src/resources/org/apache/lucene/analysis/ar/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/fa/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/ro/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/bg/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/hi/stopwords.txt
      See http://members.unine.ch/jacques.savoy/clef/index.html.

      The German,Spanish,Finnish,French,Hungarian,Italian,Portuguese,Russian and Swedish light stemmers
      (common) are based on BSD-licensed reference implementations created by Jacques Savoy and
      Ljiljana Dolamic. These files reside in:
      analysis/common/src/java/org/apache/lucene/analysis/de/GermanLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/de/GermanMinimalStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/es/SpanishLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/fi/FinnishLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchMinimalStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/hu/HungarianLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/it/ItalianLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/ru/RussianLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/sv/SwedishLightStemmer.java

      The Stempel analyzer (stempel) includes BSD-licensed software developed 
      by the Egothor project http://egothor.sf.net/, created by Leo Galambos, Martin Kvapil,
      and Edmond Nolan.

      The Polish analyzer (stempel) comes with a default
      stopword list that is BSD-licensed created by the Carrot2 project. The file resides
      in stempel/src/resources/org/apache/lucene/analysis/pl/stopwords.txt.
      See http://project.carrot2.org/license.html.

      The SmartChineseAnalyzer source code (smartcn) was
      provided by Xiaoping Gao and copyright 2009 by www.imdict.net.

      WordBreakTestUnicode_*.java (under modules/analysis/common/src/test/) 
      is derived from Unicode data such as the Unicode Character Database. 
      See http://unicode.org/copyright.html for more details.

      The Morfologik analyzer (morfologik) includes BSD-licensed software
      developed by Dawid Weiss and Marcin Miłkowski (http://morfologik.blogspot.com/).

      Morfologik uses data from Polish ispell/myspell dictionary
      (http://www.sjp.pl/slownik/en/) licenced on the terms of (inter alia)
      LGPL and Creative Commons ShareAlike.

      Morfologic includes data from BSD-licensed dictionary of Polish (SGJP)
      (http://sgjp.pl/morfeusz/)

      Servlet-api.jar and javax.servlet-*.jar are under the CDDL license, the original
      source code for this can be found at http://www.eclipse.org/jetty/downloads.php

      ===========================================================================
      Kuromoji Japanese Morphological Analyzer - Apache Lucene Integration
      ===========================================================================

      This software includes a binary and/or source version of data from

        mecab-ipadic-2.7.0-20070801

      which can be obtained from

        http://atilika.com/releases/mecab-ipadic/mecab-ipadic-2.7.0-20070801.tar.gz

      or

        http://jaist.dl.sourceforge.net/project/mecab/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz

      ===========================================================================
      mecab-ipadic-2.7.0-20070801 Notice
      ===========================================================================

      Nara Institute of Science and Technology (NAIST),
      the copyright holders, disclaims all warranties with regard to this
      software, including all implied warranties of merchantability and
      fitness, in no event shall NAIST 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 tortuous action, arising out
      of or in connection with the use or performance of this software.

      A large portion of the dictionary entries
      originate from ICOT Free Software.  The following conditions for ICOT
      Free Software applies to the current dictionary as well.

      Each User may also freely distribute the Program, whether in its
      original form or modified, to any third party or parties, PROVIDED
      that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
      on, or be attached to, the Program, which is distributed substantially
      in the same form as set out herein and that such intended
      distribution, if actually made, will neither violate or otherwise
      contravene any of the laws and regulations of the countries having
      jurisdiction over the User or the intended distribution itself.

      NO WARRANTY

      The program was produced on an experimental basis in the course of the
      research and development conducted during the project and is provided
      to users as so produced on an experimental basis.  Accordingly, the
      program is provided without any warranty whatsoever, whether express,
      implied, statutory or otherwise.  The term "warranty" used herein
      includes, but is not limited to, any warranty of the quality,
      performance, merchantability and fitness for a particular purpose of
      the program and the nonexistence of any infringement or violation of
      any right of any third party.

      Each user of the program will agree and understand, and be deemed to
      have agreed and understood, that there is no warranty whatsoever for
      the program and, accordingly, the entire risk arising from or
      otherwise connected with the program is assumed by the user.

      Therefore, neither ICOT, the copyright holder, or any other
      organization that participated in or was otherwise related to the
      development of the program and their respective officials, directors,
      officers and other employees shall be held liable for any and all
      damages, including, without limitation, general, special, incidental
      and consequential damages, arising out of or otherwise in connection
      with the use or inability to use the program or any product, material
      or result produced or otherwise obtained by using the program,
      regardless of whether they have been advised of, or otherwise had
      knowledge of, the possibility of such damages at any time during the
      project or thereafter.  Each user will be deemed to have agreed to the
      foregoing by his or her commencement of use of the program.  The term
      "use" as used herein includes, but is not limited to, the use,
      modification, copying and distribution of the program and the
      production of secondary products from the program.

      In the case where the program, whether in its original form or
      modified, was distributed or delivered to or received by a user from
      any person, organization or entity other than ICOT, unless it makes or
      grants independently of ICOT any specific warranty to the user in
      writing, such person, organization or entity, will also be exempted
      from and not be held liable to the user for any such damages as noted
      above as far as the program is concerned.

  (ASLv2) Apache Solr
    The following NOTICE information applies:
      Apache Solrj
      Copyright 2006-2014 The Apache Software Foundation

  (ASLv2) Joda Time
    The following NOTICE information applies:
      This product includes software developed by
      Joda.org (http://www.joda.org/).

  (ASLv2) Apache ActiveMQ
    The following NOTICE information applies:
      ActiveMQ :: Client
      Copyright 2005-2015 The Apache Software Foundation

  (ASLv2) Apache Geronimo
    The following NOTICE information applies:
      Apache Geronimo 
      Copyright 2003-2008 The Apache Software Foundation

  (ASLv2) Swagger Core
    The following NOTICE information applies:
      Swagger Core 1.5.3-M1
      Copyright 2015 Reverb Technologies, Inc.

  (ASLv2) Google GSON
    The following NOTICE information applies:
      Copyright 2008 Google Inc.

  (ASLv2) JSON-SMART
    The following NOTICE information applies:
      Copyright 2011 JSON-SMART authors

   (ASLv2) JsonPath
     The following NOTICE information applies:
       Copyright 2011 JsonPath authors

  (ASLv2) Kite SDK
    The following NOTICE information applies:
      This product includes software developed by Cloudera, Inc.
      (http://www.cloudera.com/).

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

      This product includes software developed by
      Saxonica (http://www.saxonica.com/).

  (ASLv2) MongoDB Java Driver
    The following NOTICE information applies:
      Copyright (C) 2008-2013 10gen, Inc.

  (ASLv2) Parquet MR
    The following NOTICE information applies:
      Parquet MR
      Copyright 2012 Twitter, Inc.

      This project includes code from https://github.com/lemire/JavaFastPFOR
      parquet-column/src/main/java/parquet/column/values/bitpacking/LemireBitPacking.java
      Apache License Version 2.0 http://www.apache.org/licenses/.
      (c) Daniel Lemire, http://lemire.me/en/

  (ASLv2) Twitter4J
    The following NOTICE information applies:
      Copyright 2007 Yusuke Yamamoto
      
      Twitter4J includes software from JSON.org to parse JSON response from the Twitter API. You can see the license term at http://www.JSON.org/license.html
  
  (ASLv2) JOAuth
    The following NOTICE information applies:
      JOAuth
      Copyright 2010-2013 Twitter, Inc
  
  (ASLv2) Hosebird Client
    The following NOTICE information applies:
      Hosebird Client (hbc)
      Copyright 2013 Twitter, Inc.

  (ASLv2) GeoIP2 Java API
    The following NOTICE information applies:
      GeoIP2 Java API
      This software is Copyright (c) 2013 by MaxMind, Inc.

  (ASLv2) Woodstox Core ASL
    The following NOTICE information applies:
      This product currently only contains code developed by authors
      of specific components, as identified by the source code files.

      Since product implements StAX API, it has dependencies to StAX API
      classes.

  (ASLv2) Amazon Web Services SDK
    The following NOTICE information applies:
      Copyright 2010-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.

      This product includes software developed by
      Amazon Technologies, Inc (http://www.amazon.com/).

      **********************
      THIRD PARTY COMPONENTS
      **********************
      This software includes third party software subject to the following copyrights:
      - XML parsing and utility functions from JetS3t - Copyright 2006-2009 James Murty.
      - JSON parsing and utility functions from JSON.org - Copyright 2002 JSON.org.
      - PKCS#1 PEM encoded private key parsing and utility functions from oauth.googlecode.com - Copyright 1998-2010 AOL Inc.

   (ASLv2) Apache Commons DBCP
      The following NOTICE information applies:
        Apache Commons DBCP
        Copyright 2001-2015 The Apache Software Foundation.
      
   (ASLv2) Apache Commons Pool
      The following NOTICE information applies:
        Apache Commons Pool
        Copyright 1999-2009 The Apache Software Foundation.

    (ASLv2) Apache Derby
      The following NOTICE information applies:
        Apache Derby
        Copyright 2004-2014 Apache, Apache DB, Apache Derby, Apache Torque, Apache JDO, Apache DDLUtils, 
        the Derby hat logo, the Apache JDO logo, and the Apache feather logo are trademarks of The Apache Software Foundation.

    (ASLv2) Apache Directory Server
      The following NOTICE information applies:
        ApacheDS Protocol Kerberos Codec
        Copyright 2003-2013 The Apache Software Foundation

        ApacheDS I18n
        Copyright 2003-2013 The Apache Software Foundation

        Apache Directory API ASN.1 API
        Copyright 2003-2013 The Apache Software Foundation

        Apache Directory LDAP API Utilities
        Copyright 2003-2013 The Apache Software Foundation

    (ASLv2) Apache Curator
      The following NOTICE information applies:
        Curator Framework
        Copyright 2011-2014 The Apache Software Foundation

        Curator Client
        Copyright 2011-2014 The Apache Software Foundation

        Curator Recipes
        Copyright 2011-2014 The Apache Software Foundation

    (ASLv2) The Netty Project
      The following NOTICE information applies:
        The Netty Project
        Copyright 2011 The Netty Project

    (ASLv2) Apache Xerces Java
      The following NOTICE information applies:
        Apache Xerces Java
        Copyright 1999-2007 The Apache Software Foundation

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

        Portions of this software were originally based on the following:
          - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
          - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
          - voluntary contributions made by Paul Eng on behalf of the 
            Apache Software Foundation that were originally developed at iClick, Inc.,
            software copyright (c) 1999.

    (ASLv2) Metadata-Extractor
      The following NOTICE information applies:
        Metadata-Extractor
        Copyright 2002-2015 Drew Noakes

    (ASLv2) Couchbase Java SDK
      The following NOTICE information applies:
        Couchbase Java SDK
        Copyright 2014 Couchbase, Inc.

    (ASLv2) RxJava
      The following NOTICE information applies:
        Couchbase Java SDK
        Copyright 2012 Netflix, Inc.

    (ASLv2) HBase Common
      The following NOTICE information applies:
        This product includes portions of the Guava project v14, specifically
        'hbase-common/src/main/java/org/apache/hadoop/hbase/io/LimitInputStream.java'

        Copyright (C) 2007 The Guava Authors

        Licensed under the Apache License, Version 2.0

    (ASLv2) Java Native Access
      The following NOTICE information applies:
         Java Native Access
         Copyright 2015 Java Native Access

    (ASLv2) HTrace Core
      The following NOTICE information applies:
        In addition, this product includes software dependencies. See
        the accompanying LICENSE.txt for a listing of dependencies
        that are NOT Apache licensed (with pointers to their licensing)

        Apache HTrace includes an Apache Thrift connector to Zipkin. Zipkin
        is a distributed tracing system that is Apache 2.0 Licensed.
        Copyright 2012 Twitter, Inc.



    (ASLv2) Groovy (org.codehaus.groovy:groovy:jar:2.4.5 - http://www.groovy-lang.org)
      The following NOTICE information applies:
          Groovy Language
             Copyright 2003-2015 The respective authors and developers
             Developers and Contributors are listed in the project POM file
             and Gradle build file

             This product includes software developed by
             The Groovy community (http://groovy.codehaus.org/).

    (ASLv2) Apache Ignite
      The following NOTICE information applies:
        Apache Ignite
        Copyright 2015 The Apache Software Foundation

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


        This software includes code from IntelliJ IDEA Community Edition
        Copyright (C) JetBrains s.r.o.
        https://www.jetbrains.com/idea/
        Licensed under Apache License, Version 2.0.
        http://search.maven.org/#artifactdetails%7Corg.jetbrains%7Cannotations%7C13.0%7Cjar

    (ASLv2) Apache Geronimo JSR-107 JCache Spec API
      The following NOTICE information applies:
        Apache Geronimo JSR-107 JCache Spec API
        Copyright 2009-2014 The Apache Software Foundation

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

(ASLv2) Carrotsearch HPPC
      The following NOTICE information applies:
      HPPC borrowed code, ideas or both from:

       * Apache Lucene, http://lucene.apache.org/
         (Apache license)
       * Fastutil, http://fastutil.di.unimi.it/
         (Apache license)
       * Koloboke, https://github.com/OpenHFT/Koloboke
         (Apache license)

    (ASLv2) t-digest
       The following NOTICE information applies:
       The code for the t-digest was originally authored by Ted Dunning
       A number of small but very helpful changes have been contributed by Adrien Grand (https://github.com/jpountz)

    (ASLv2) subethasmtp
       The following NOTICE information applies:

       Copyright (C) 2006-2007 SubEthaMail.org

    (ASLv2) Apache Commons Email
       The following NOTICE information applies:
       Apache Commons Email
       Copyright 2002-2015 The Apache Software Foundation

    (ASLv2) Apache Hive
       The following NOTICE information applies:
       Apache Hive
       Copyright 2008-2015 The Apache Software Foundation

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

       This product includes Jersey (https://jersey.java.net/)
       Copyright (c) 2010-2014 Oracle and/or its affiliates.

       This project includes software copyrighted by Microsoft Corporation and
       licensed under the Apache License, Version 2.0.

       This project includes software copyrighted by Dell SecureWorks and
       licensed under the Apache License, Version 2.0.

    (ASLv2) BoneCP
       The following NOTICE information applies:
       BoneCP
       Copyright 2010 Wallace Wadge

  (ASLv2) Apache Hadoop
    The following NOTICE information applies:
      The binary distribution of this product bundles binaries of
      org.iq80.leveldb:leveldb-api (https://github.com/dain/leveldb), which has the
      following notices:
      * Copyright 2011 Dain Sundstrom <dain@iq80.com>
      * Copyright 2011 FuseSource Corp. http://fusesource.com

      The binary distribution of this product bundles binaries of
      org.fusesource.hawtjni:hawtjni-runtime (https://github.com/fusesource/hawtjni),
      which has the following notices:
      * This product includes software developed by FuseSource Corp.
        http://fusesource.com
      * This product includes software developed at
        Progress Software Corporation and/or its  subsidiaries or affiliates.
      * This product includes software developed by IBM Corporation and others.

  (ASLv2) Metrics
    The following NOTICE information applies:
      Metrics
      Copyright 2010-2012 Coda Hale and Yammer, Inc.

      This product includes software developed by Coda Hale and Yammer, Inc.

      This product includes code derived from the JSR-166 project (ThreadLocalRandom), which was released
      with the following comments:

          Written by Doug Lea with assistance from members of JCP JSR-166
          Expert Group and released to the public domain, as explained at
          http://creativecommons.org/publicdomain/zero/1.0/

This includes derived works from the Apache Software License V2 library python-evtx (https://github.com/williballenthin/python-evtx)
Copyright 2012, 2013 Willi Ballenthin william.ballenthin@mandiant.com
while at Mandiant http://www.mandiant.com
The derived work is adapted from Evtx/Evtx.py, Evtx/BinaryParser.py, Evtx/Nodes.py, Evtx/Views.py and can be found in the org.apache.nifi.processors.evtx.parser package.

This includes derived works from the Apache Storm (ASLv2 licensed) project (https://github.com/apache/storm):
Copyright 2015 The Apache Software Foundation
The derived work is adapted from
  org/apache/storm/hive/common/HiveWriter.java
  org/apache/storm/hive/common/HiveOptions.java
and can be found in the org.apache.nifi.util.hive package

This includes derived works from the Apache Hive (ASLv2 licensed) project (https://github.com/apache/hive):
Copyright 2008-2016 The Apache Software Foundation
The derived work is adapted from
  release-1.2.1/ql/src/java/org/apache/hadoop/hive/ql/io/orc/WriterImpl.java
and can be found in the org.apache.hadoop.hive.ql.io.orc package

************************
Common Development and Distribution License 1.1
************************

The following binary components are provided under the Common Development and Distribution License 1.1. See project link for details.

    (CDDL 1.1) (GPL2 w/ CPE) jersey-core-client (org.glassfish.jersey.core:jersey-client:jar:2.19 - https://jersey.java.net/jersey-client/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (com.sun.jersey:jersey-client:jar:1.19 - https://jersey.java.net/jersey-client/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-core-common (org.glassfish.jersey.core:jersey-common:jar:2.19 - https://jersey.java.net/jersey-common/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-core (com.sun.jersey:jersey-core:jar:1.19 - https://jersey.java.net/jersey-core/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-spring (com.sun.jersey:jersey-spring:jar:1.19 - https://jersey.java.net/jersey-spring/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-servlet (com.sun.jersey:jersey-servlet:jar:1.19 - https://jersey.java.net/jersey-servlet/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-multipart (com.sun.jersey:jersey-multipart:jar:1.19 - https://jersey.java.net/jersey-multipart/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-server (com.sun.jersey:jersey-server:jar:1.19 - https://jersey.java.net/jersey-server/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-json (com.sun.jersey:jersey-json:jar:1.19 - https://jersey.java.net/jersey-json/)
    (CDDL 1.1) (GPL2 w/ CPE) Old JAXB Runtime (com.sun.xml.bind:jaxb-impl:jar:2.2.3-1 - http://jaxb.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) Java Architecture For XML Binding (javax.xml.bind:jaxb-api:jar:2.2.2 - https://jaxb.dev.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) MIME Streaming Extension (org.jvnet.mimepull:mimepull:jar:1.9.3 - http://mimepull.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaMail API (compat) (javax.mail:mail:jar:1.4.7 - http://kenai.com/projects/javamail/mail)
    (CDDL 1.1) (GPL2 w/ CPE) JSP Implementation (org.glassfish.web:javax.servlet.jsp:jar:2.3.2 - http://jsp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages (TM) TagLib Implementation (org.glassfish.web:javax.servlet.jsp.jstl:jar:1.2.2 - http://jstl.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Expression Language 3.0 (org.glassfish:javax.el:jar:3.0.0 - http://el-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages(TM) API (javax.servlet.jsp:javax.servlet.jsp-api:jar:2.3.1 - http://jsp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Expression Language 3.0 API  (javax.el:javax.el-api:jar:3.0.0 - http://uel-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages(TM) Standard Tag Library API  (javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:jar:1.2.1 - http://jcp.org/en/jsr/detail?id=52)
    (CDDL 1.1) (GPL2 w/ CPE) Java Servlet API  (javax.servlet:javax.servlet-api:jar:3.1.0 - http://servlet-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Javax JMS Api (javax.jms:javax.jms-api:jar:2.0.1 - http://java.net/projects/jms-spec/pages/Home)
    (CDDL 1.1) (GPL2 w/ CPE) JSON Processing API (javax.json:javax.json-api:jar:1.0 - http://json-processing-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JSON Processing Default Provider (org.glassfish:javax.json:jar:1.0.4 - https://jsonp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) OSGi resource locator bundle (org.glassfish.hk2:osgi-resource-locator:jar:1.0.1 - http://glassfish.org/osgi-resource-locator)
    (CDDL 1.1) (GPL2 w/ CPE) javax.annotation API (javax.annotation:javax.annotation-api:jar:1.2 - http://jcp.org/en/jsr/detail?id=250)
    (CDDL 1.1) (GPL2 w/ CPE) HK2 API module (org.glassfish.hk2:hk2-api:jar:2.4.0-b25 - https://hk2.java.net/hk2-api)
    (CDDL 1.1) (GPL2 w/ CPE) ServiceLocator Default Implementation (org.glassfish.hk2:hk2-locator:jar:2.4.0-b25 - https://hk2.java.net/hk2-locator)
    (CDDL 1.1) (GPL2 w/ CPE) HK2 Implementation Utilities (org.glassfish.hk2:hk2-utils:jar:2.4.0-b25 - https://hk2.java.net/hk2-utils)
    (CDDL 1.1) (GPL2 w/ CPE) aopalliance version 1.0 repackaged as a module (org.glassfish.hk2.external:aopalliance-repackaged:jar:2.4.0-b25 - https://hk2.java.net/external/aopalliance-repackaged)
    (CDDL 1.1) (GPL2 w/ CPE) javax.inject:1 as OSGi bundle (org.glassfish.hk2.external:javax.inject:jar:2.4.0-b25 - https://hk2.java.net/external/javax.inject)
    (CDDL 1.1) (GPL2 w/ CPE) javax.ws.rs-api (javax.ws.rs:javax.ws.rs-api:jar:2.0.1 - http://jax-rs-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-repackaged-guava (org.glassfish.jersey.bundles.repackaged:jersey-guava:bundle:2.19 - https://jersey.java.net/project/project/jersey-guava/)


************************
Common Development and Distribution License 1.0
************************

The following binary components are provided under the Common Development and Distribution License 1.0.  See project link for details.

    (CDDL 1.0) JavaServlet(TM) Specification (javax.servlet:servlet-api:jar:2.5 - no url available)
    (CDDL 1.0) (GPL3) Streaming API For XML (javax.xml.stream:stax-api:jar:1.0-2 - no url provided)
    (CDDL 1.0) JavaBeans Activation Framework (JAF) (javax.activation:activation:jar:1.1 - http://java.sun.com/products/javabeans/jaf/index.jsp)
    (CDDL 1.0) JSR311 API (javax.ws.rs:jsr311-api:jar:1.1.1 - https://jsr311.dev.java.net)
    (CDDL 1.0) JHighlight (org.codelibs:jhighlight:1.0.2 - https://github.com/codelibs/jhighlight)

************************
Creative Commons Attribution-ShareAlike 3.0
************************

The following binary components are provided under the Creative Commons Attribution-ShareAlike 3.0.  See project link for details.

	(CCAS 3.0) MaxMind DB (https://github.com/maxmind/MaxMind-DB)

************************
Eclipse Public License 1.0
************************

The following binary components are provided under the Eclipse Public License 1.0.  See project link for details.

    (EPL 1.0) AspectJ Weaver (org.aspectj:aspectjweaver:jar:1.8.5 - http://www.eclipse.org/aspectj/)
    (EPL 1.0) AspectJ Runtime (org.aspectj:aspectjrt:jar:1.8.0 - http://www.eclipse.org/aspectj/)
    (EPL 1.0)(MPL 2.0) H2 Database (com.h2database:h2:jar:1.3.176 - http://www.h2database.com/html/license.html)
    (EPL 1.0)(LGPL 2.1) Logback Classic (ch.qos.logback:logback-classic:jar:1.1.3 - http://logback.qos.ch/)
    (EPL 1.0)(LGPL 2.1) Logback Core (ch.qos.logback:logback-core:jar:1.1.3 - http://logback.qos.ch/)
    (EPLv1.0) JRuby (org.jruby:jruby-complete:9.0.4.0 - http://jruby.org).

        JRuby is licensed under three licenses - the EPL 1.0, GPL 2 and LGPL 2.1. Apache NiFi uses the EPL v1.0 license.

        The following NOTICE information applies:
            Copyright (c) 2007-2015 The JRuby project
    (EPL 1.0) Eclipse Paho MQTT Client (org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2 - https://github.com/eclipse/paho.mqtt.java)
    (EPL 1.0) Eclipse Link (org.eclipse.persistence:eclipselink:2.5.2 - http://www.eclipse.org/eclipselink/)
    (EPL 1.0) Common Service Data Objects (org.eclipse.persistence:commonj.sdo:2.1.1 - http://www.eclipse.org/eclipselink/)
    (EPL 1.0) Java Persistence API (org.eclipse.persistence:javax.persistence:2.1.0 - http://www.eclipse.org/eclipselink/)

*****************
Mozilla Public License v2.0
*****************

The following binary components are provided under the Mozilla Public License v2.0.  See project link for details.

    (MPL 2.0) Saxon HE (net.sf.saxon:Saxon-HE:jar:9.6.0-5 - http://www.saxonica.com/)

*****************
Mozilla Public License v1.1
*****************

The following binary components are provided under the Mozilla Public License v1.1.  See project link for details.

    (MPL 1.1) HAPI Base (ca.uhn.hapi:hapi-base:2.2 - http://hl7api.sourceforge.net/)
    (MPL 1.1) HAPI Structures (ca.uhn.hapi:hapi-structures-v*:2.2 - http://hl7api.sourceforge.net/)
    (MPL 1.1) Java port of universalchardet (com.googlecode.juniversalchardet:juniversalchardet:1.0.3 - https://code.google.com/archive/p/juniversalchardet/)

******************
Python Software Foundation License v2
******************

The following binary components are provided under the Python Software Foundation License v2

  (PSFLv2) Jython (org.python:jython-standalone:2.7.0 - http://www.jython.org/)
    The following NOTICE information applies:
        This product includes software developed by:
            o The Apache Software Foundation (http://www.apache.org/)

*****************
Public Domain
*****************

The following binary components are provided to the 'Public Domain'.  See project link for details.

    (Public Domain) XZ for Java (org.tukaani:xz:jar:1.5 - http://tukaani.org/xz/java.html
    (Public Domain) AOP Alliance 1.0 (http://aopalliance.sourceforge.net/)

The following binary components are provided under the Creative Commons Zero license version 1.0.  See project link for details.

    (CC0v1.0) JSR166e for Twitter (com.twitter:jsr166e:jar:1.1.0 - https://github.com/twitter/jsr166e)

******************
SIL OFL 1.1
******************

The following binary components are provided under the SIL Open Font License 1.1
  (SIL OFL 1.1) FontAwesome (4.6.1 - http://fortawesome.github.io/Font-Awesome/license/)
