Apache NiFi
Copyright 2014-2021 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 under Apache Software License V2:
  BoundedByteArrayOutputStream.java adapted to SoftLimitBoundedByteArrayOutputStream.java

This product includes derived works from Apache Commons Lang (ASLv2 licensed)
  Copyright 2019 The Apache Software Foundation
  The derived work is adapted from the class StringUtils:
    https://github.com/apache/commons-lang/blob/465e6becd8beda9569fbdc9ff44fac7dc3c5d1c6/src/main/java/org/apache/commons/lang3/StringUtils.java

This product 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 Hadoop (ASLv2 licensed) project (https://github.com/apache/hadoop):
  Copyright 2014 The Apache Software Foundation
  The derived work is adapted from
    org/apache/hadoop/security/authentication/client/KerberosAuthenticator.java
  and can be found in the org.apache.nifi.hadoop 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
  The derived work is adapted from
    release-3.0.0/serde/src/java/org/apache/hadoop/hive/serde2/JsonSerDe.java
  and can be found in the org.apache.hive.streaming.NiFiRecordSerDe class

This includes derived works from the Apache Software License V2 library Jolt (https://github.com/bazaarvoice/jolt)
  Copyright 2013-2014 Bazaarvoice, Inc
  The derived work is adapted from com.bazaarvoice.jolt.chainr.ChainrBuilder.java, com.bazaarvoice.jolt.chainr.spec.ChainrSpec.java,
  com.bazaarvoice.jolt.chainr.spec.ChainrEntry.java and can be found in the org.apache.nifi.processors.standard.util.jolt.TransformFactory.java class.

This includes derived works from Elastic Logstash (https://github.com/elastic/logstash/tree/v1.4.0/) and modified by Anthony Corbacho, and contributors
  available under an Apache Software License V2.
  Copyright 2009-2013 Jordan Sissel, Pete Fritchman, and contributors.
  Copyright 2014 Anthony Corbacho, and contributors.
  The derived work consists in modifications from patterns/grok-patterns
  and can be found in the file nifi/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestExtractGrok/patterns

This includes derived works from Dropwizard Metrics available under Apache Software License V2 (https://github.com/dropwizard/metrics)
  Copyright 2010-2013 Coda Hale and Yammer, Inc., 2014-2017 Dropwizard Team
  This product includes software developed by Coda Hale and Yammer, Inc.

  This product includes code derived from the JSR-166 project (ThreadLocalRandom, Striped64,
  LongAdder), 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/

  The derived work in the nifi-metrics module is adapted from
    https://github.com/dropwizard/metrics/blob/v2.2.0/metrics-core/src/main/java/com/yammer/metrics/core/VirtualMachineMetrics.java
  and can be found in
    nifi-commons/nifi-metrics/src/main/java/org/apache/nifi/metrics/jvm/JvmMetrics.java
    nifi-commons/nifi-metrics/src/main/java/org/apache/nifi/metrics/jvm/JmxJvmMetrics.java

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

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

  (ASLv2) Apache Ant
    The following NOTICE information applies:
      Copyright 1999-2018 The Apache Software Foundation

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

      The <sync> task is based on code Copyright (c) 2002, Landmark
      Graphics Corp that has been kindly donated to the Apache Software
      Foundation.

  (ASLv2) Apache BVal Project
    The following NOTICE information applies:
      Apache BVal project
     Copyright 2010-2016 The Apache Software Foundation.

     This product includes software developed by Agimatec GmbH.
     Copyright 2007-2010 Agimatec GmbH. All rights reserved.

  (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-2016 The Apache Software Foundation

  (ASLv2) Apache Commons Compress
    The following NOTICE information applies:
      Apache Commons Compress
      Copyright 2002-2017 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) Apache Commons Crypto
    The following NOTICE information applies:
      Apache Commons Crypto
      Copyright 2016-2016 The Apache Software Foundation

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

    This product contains parts that were originally based on software from BEA.
    Copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

    This product contains 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)

    This product contains the Piccolo XML Parser for Java
    (http://piccolo.sourceforge.net/). Copyright 2002 Yuval Oren.

    This product contains the chunks_parse_cmds.tbl file from the vsdump program.
    Copyright (C) 2006-2007 Valek Filippov (frob@df.ru)

    This product contains parts of the eID Applet project
    (http://eid-applet.googlecode.com). Copyright (c) 2009-2014
    FedICT (federal ICT department of Belgium), e-Contract.be BVBA (https://www.e-contract.be),
    Bart Hanssens from FedICT

    CurvesAIP is BSD-licensed software (https://github.com/virtuald/curvesapi/)
    Copyright (c) 2005, Graph Builder

  (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-2016 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 FontBox
      The following NOTICE information applies:
        Apache FontBox
        Copyright 2008-2017 The Apache Software Foundation

    (ASLv2) Apache SIS
      The following NOTICE information applies:
        Apache SIS
        Copyright 2010-2017 The Apache Software Foundation

    (ASLv2) Apache JempBox
      The following NOTICE information applies:
        Apache JempBox
        Copyright 2008-2017 The Apache Software Foundation

    (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) Rome
      The following NOTICE information applies:
        Rome Copyright Notices
        Copyright 2004 Sun Microsystems, Inc.
        Copyright 2011 The ROME Team
  
    (ASLv2) Apache Commons Lang
    The following NOTICE information applies:
      Apache Commons Lang
      Copyright 2001-2017 The Apache Software Foundation

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

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

  (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 5
      Copyright (c) 2002-2021 Pivotal, Inc.

  (ASLv2) Spring Security
    The following NOTICE information applies:
          Spring Security 5
          Copyright (c) 2002-2021 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

      Apache MINA Core 2.0.16
      Copyright 2004-2016 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 CLI
    The following NOTICE information applies:
        Apache Commons CLI
        Copyright 2001-2017 The Apache Software Foundation

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

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

  (ASLv2) Java Native Access Platform
    The following NOTICE information applies:
      Java Native Access Platform
      Copyright 2013 Timothy Wall, Matthias Bläsing

      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 Calcite -- Avatica
    The following NOTICE information applies:
		Apache Calcite -- Avatica
		Copyright 2012-2017 The Apache Software Foundation

  (ASLv2) Apache Calcite
    The following NOTICE information applies:
		Apache Calcite
		Copyright 2012-2017 The Apache Software Foundation
		
		This product is based on source code originally developed
		by DynamoBI Corporation, LucidEra Inc., SQLstream Inc. and others
		under the auspices of the Eigenbase Foundation
		and released as the LucidDB project.

  (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-2014 The Apache Software Foundation

  (ASLv2) Apache Avro
    The following NOTICE information applies:
      Apache Avro
      Copyright 2009-2017 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 Exec
    The following NOTICE information applies:
      Apache Commons Exec
      Copyright 2005-2016 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-2019 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) Apache POI
      The following NOTICE information applies:
        Apache POI
        Copyright 2012 The Apache Software Foundation.
        
        This product contains parts that were originally based on software from BEA.
        Copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/> (dead link),
        which was acquired by Oracle Corporation in 2008.
        <http://www.oracle.com/us/corporate/Acquisitions/bea/index.html>
        <https://en.wikipedia.org/wiki/BEA_Systems>
        
        This product contains 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)

        This product contains the Piccolo XML Parser for Java
        (http://piccolo.sourceforge.net/). Copyright 2002 Yuval Oren.

        This product contains the chunks_parse_cmds.tbl file from the vsdump program.
        Copyright (C) 2006-2007 Valek Filippov (frob@df.ru)

        This product contains parts of the eID Applet project 
        <http://eid-applet.googlecode.com> and <https://github.com/e-Contract/eid-applet>.
        Copyright (c) 2009-2014
        FedICT (federal ICT department of Belgium), e-Contract.be BVBA (https://www.e-contract.be),
        Bart Hanssens from FedICT

  (ASLv2) Apache CXF
    The following NOTICE information applies:
      Apache CXF
      Copyright 2008-2017 The Apache Software Foundation

  (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-2017 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) Google OAuth Client Library
    The following NOTICE information applies:
      Copyright 2012 Google Inc.

  (ASLv2) Google HTTP Client Library for Java
    The following NOTICE information applies:
      Copyright 2011 Google Inc.

  (ASLv2) Google Guice
    The following NOTICE information applies:
      Google Guice - Core Library
      Copyright 2006-2011 Google, Inc.

  (ASLv2) Google Cloud Client Library for Java
    The following NOTICE information applies:
      Google Cloud Client Library for Java
      Copyright 2016 Google Inc. All Rights Reserved.

  (ASLv2) Guava
    The following NOTICE information applies:
      Guava
      Copyright 2015 The Guava Authors

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

  (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) 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) 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) 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) AWS SDK for Java 2.0
      The following NOTICE information applies:
        Copyright 2010-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.

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

  (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.
      - 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) Objenesis
      The following NOTICE information applies:
        Objenesis
        Copyright 2006-2013 Joe Walnes, Henri Tremblay, Leonardo Mesquita

   (ASLv2) Apache Maven
      The following NOTICE information applies:
        Apache Maven
        Copyright 2003-2017 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) 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) Hazelcast
      The following NOTICE information applies:
        Core Hazelcast Module 4.0.1
        Copyright (c) 2008-2020, Hazelcast, Inc. All Rights Reserved.

    (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 and v21, specifically
          'hbase-common/src/main/java/org/apache/hadoop/hbase/io/LimitInputStream.java'
          'hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java'
          'hbase-common/src/main/java/org/apache/hadoop/hbase/util/ByteBufferUtils.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) Apache HTrace Core
      The following NOTICE information applies:
        Copyright 2016 The Apache Software Foundation

        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-all:pom:2.5.4 and its submodules included as transitive dependencies - http://www.groovy-lang.org)
        groovy
        groovy-ant
        groovy-cli-commons
        groovy-cli-picocli
        groovy-console
        groovy-datetime
        groovy-docgenerator
        groovy-groovydoc
        groovy-groovysh
        groovy-jmx
        groovy-json
        groovy-jsr223
        groovy-macro
        groovy-nio
        groovy-servlet
        groovy-sql
        groovy-swing
        groovy-templates
        groovy-test
        groovy-test-junit5
        groovy-testng
        groovy-xml
    The following NOTICE information applies:
      Groovy Language
         Copyright 2003-2018 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/).

         This product bundles icons from the famfamfam.com silk icons set
         http://www.famfamfam.com/lab/icons/silk/
         Licensed under the Creative Commons Attribution Licence v2.5
         http://creativecommons.org/licenses/by/2.5/

  (ASLv2) Groovy 2.4.16 (http://www.groovy-lang.org)
        groovy-2.4.16-indy
        groovy-json-2.4.16-indy
        groovy-sql-2.4.16-indy
    The following NOTICE information applies:
        Apache Groovy
        Copyright 2003-2018 The Apache Software Foundation

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

        This product includes/uses ANTLR (http://www.antlr2.org/)
        developed by Terence Parr 1989-2006

  (ASLv2) Groovy (org.codehaus.groovy:groovy-all:jar:2.4.11 - http://www.groovy-lang.org)
     The following NOTICE information applies:
       Apache Groovy
       Copyright 2003-2017 The Apache Software Foundation

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

       This product includes/uses ANTLR (http://www.antlr2.org/)
       developed by Terence Parr 1989-2006

       This product bundles icons from the famfamfam.com silk icons set
       http://www.famfamfam.com/lab/icons/silk/
       Licensed under the Creative Commons Attribution Licence v2.5
       http://creativecommons.org/licenses/by/2.5/

  (ASLv2) Groovy (org.codehaus.groovy:groovy-all:jar:2.1.6 - http://www.groovy-lang.org)
    The following NOTICE information applies:
      Groovy Language
         Copyright 2003-2012 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) RethinkDB Java Driver
      The following NOTICE information applies:
      RethinkDB Language Drivers

      Copyright 2010-2012 RethinkDB

    (ASLv2) Neo4j Java Driver
      Neo4j
      Copyright © 2002-2018 Neo4j Sweden AB (referred to in this notice as "Neo4j")
      [http://neo4j.com]

    (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 OpenNLP Tools
      Apache OpenNLP Tools
      Copyright 2015 The Apache Software Foundation

    (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) ParCEFone
    The following NOTICE information applies:
      ParCEFone
      Copyright 2016 Fluenda

  (ASLv2) Grok
    The following NOTICE information applies:
      Grok
      Copyright 2014 Anthony Corbacho, and contributors.

  (ASLv2) gRPC-Java
    The following NOTICE information applies:
	Copyright 2014, gRPC Authors All rights reserved.

	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.

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

	This product contains a modified portion of 'OkHttp', an open source
	HTTP & SPDY client for Android and Java applications, which can be obtained
	at:

	  * LICENSE:
	    * okhttp/third_party/okhttp/LICENSE (Apache License 2.0)
	  * HOMEPAGE:
	    * https://github.com/square/okhttp
	  * LOCATION_IN_GRPC:
	    * okhttp/third_party/okhttp

	This product contains a modified portion of 'Netty', an open source
	networking library, which can be obtained at:

	  * LICENSE:
	    * netty/third_party/netty/LICENSE.txt (Apache License 2.0)
	  * HOMEPAGE:
	    * https://netty.io
	  * LOCATION_IN_GRPC:
    * netty/third_party/netty

  (ASLv2) Ehcache 2.x
    The following NOTICE information applies:
      Copyright 2003-2010 Terracotta, Inc.

  (ASLv2) The Netty Project
      The following NOTICE information applies:
  	Copyright 2014 The Netty Project
  	-------------------------------------------------------------------------------
  	This product contains the extensions to Java Collections Framework which has
  	been derived from the works by JSR-166 EG, Doug Lea, and Jason T. Greene:

  	  * LICENSE:
  	    * license/LICENSE.jsr166y.txt (Public Domain)
  	  * HOMEPAGE:
  	    * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/
  	    * http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/

  	This product contains a modified version of Robert Harder's Public Domain
  	Base64 Encoder and Decoder, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.base64.txt (Public Domain)
  	  * HOMEPAGE:
  	    * http://iharder.sourceforge.net/current/java/base64/

  	This product contains a modified portion of 'Webbit', an event based
  	WebSocket and HTTP server, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.webbit.txt (BSD License)
  	  * HOMEPAGE:
  	    * https://github.com/joewalnes/webbit

  	This product contains a modified portion of 'SLF4J', a simple logging
  	facade for Java, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.slf4j.txt (MIT License)
  	  * HOMEPAGE:
  	    * http://www.slf4j.org/

  	This product contains a modified portion of 'Apache Harmony', an open source
  	Java SE, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.harmony.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * http://archive.apache.org/dist/harmony/

  	This product contains a modified portion of 'jbzip2', a Java bzip2 compression
  	and decompression library written by Matthew J. Francis. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.jbzip2.txt (MIT License)
  	  * HOMEPAGE:
  	    * https://code.google.com/p/jbzip2/

  	This product contains a modified portion of 'libdivsufsort', a C API library to construct
  	the suffix array and the Burrows-Wheeler transformed string for any input string of
  	a constant-size alphabet written by Yuta Mori. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.libdivsufsort.txt (MIT License)
  	  * HOMEPAGE:
  	    * https://github.com/y-256/libdivsufsort

  	This product contains a modified portion of Nitsan Wakart's 'JCTools', Java Concurrency Tools for the JVM,
  	 which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.jctools.txt (ASL2 License)
  	  * HOMEPAGE:
  	    * https://github.com/JCTools/JCTools

  	This product optionally depends on 'JZlib', a re-implementation of zlib in
  	pure Java, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.jzlib.txt (BSD style License)
  	  * HOMEPAGE:
  	    * http://www.jcraft.com/jzlib/

  	This product optionally depends on 'Compress-LZF', a Java library for encoding and
  	decoding data in LZF format, written by Tatu Saloranta. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.compress-lzf.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * https://github.com/ning/compress

  	This product optionally depends on 'lz4', a LZ4 Java compression
  	and decompression library written by Adrien Grand. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.lz4.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * https://github.com/jpountz/lz4-java

  	This product optionally depends on 'lzma-java', a LZMA Java compression
  	and decompression library, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.lzma-java.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * https://github.com/jponge/lzma-java

  	This product contains a modified portion of 'jfastlz', a Java port of FastLZ compression
  	and decompression library written by William Kinney. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.jfastlz.txt (MIT License)
  	  * HOMEPAGE:
  	    * https://code.google.com/p/jfastlz/

  	This product contains a modified portion of and optionally depends on 'Protocol Buffers', Google's data
  	interchange format, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.protobuf.txt (New BSD License)
  	  * HOMEPAGE:
  	    * https://github.com/google/protobuf

  	This product optionally depends on 'Bouncy Castle Crypto APIs' to generate
  	a temporary self-signed X.509 certificate when the JVM does not provide the
  	equivalent functionality.  It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.bouncycastle.txt (MIT License)
  	  * HOMEPAGE:
  	    * http://www.bouncycastle.org/

  	This product optionally depends on 'Snappy', a compression library produced
  	by Google Inc, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.snappy.txt (New BSD License)
  	  * HOMEPAGE:
  	    * https://github.com/google/snappy

  	This product optionally depends on 'JBoss Marshalling', an alternative Java
  	serialization API, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.jboss-marshalling.txt (GNU LGPL 2.1)
  	  * HOMEPAGE:
  	    * http://www.jboss.org/jbossmarshalling

  	This product optionally depends on 'Caliper', Google's micro-
  	benchmarking framework, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.caliper.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * https://github.com/google/caliper

  	This product optionally depends on 'Apache Commons Logging', a logging
  	framework, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.commons-logging.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * http://commons.apache.org/logging/

  	This product optionally depends on 'Apache Log4J', a logging framework, which
  	can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.log4j.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * http://logging.apache.org/log4j/

  	This product optionally depends on 'Aalto XML', an ultra-high performance
  	non-blocking XML processor, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.aalto-xml.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * http://wiki.fasterxml.com/AaltoHome

  	This product contains a modified version of 'HPACK', a Java implementation of
  	the HTTP/2 HPACK algorithm written by Twitter. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.hpack.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * https://github.com/twitter/hpack

  	This product contains a modified portion of 'Apache Commons Lang', a Java library
  	provides utilities for the java.lang API, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.commons-lang.txt (Apache License 2.0)
  	  * HOMEPAGE:
      * https://commons.apache.org/proper/commons-lang/

      This product contains a forked and modified version of Tomcat Native

        * LICENSE:
          * ASL2
        * HOMEPAGE:
          * http://tomcat.apache.org/native-doc/
          * https://svn.apache.org/repos/asf/tomcat/native/

  (ASLv2) Error Prone
    The following NOTICE information applies:
      Copyright 2017 Google Inc.

  (ASLv2) Instrumentation
    The following NOTICE information applies:
      Copyright 2016 Google Inc.

  (ASLv2) Google APIs
    The following NOTICE information applies:
      Copyright 2016 Google Inc.

  (ASLv2) Android JSON library
    The following NOTICE information applies:
      Copyright (C) 2010 The Android Open Source Project

  (ASLv2) tlsh
    The following NOTICE information applies:
       Java port of Trend Locality Sensitive Hash (TLSH)
       Copyright 2000-2016 Idealista, S.A

       This product includes software developed at
       Idealista, S.A (http://www.idealista.com/)

       Based on the algorithms described in Trend Micro's TLSH official
       repository, available in:

         https://github.com/trendmicro/tlsh

       Refer to the following publication for more information:

         Jonathan Oliver, Chun Cheng and Yanggui Chen, “TLSH - A Locality
         Sensitive Hash” - 4th Cybercrime and Trustworthy Computing Workshop,
         Sydney, November 2013

         https://drive.google.com/file/d/0B6FS3SVQ1i0GTXk5eDl3Y29QWlk/edit?usp=sharing

       This software is inspired in the previous Java port developed by TripleCheck:

         https://github.com/triplecheck/TLSH

  (ASLv2) Apache Parquet
    The following NOTICE information applies:
      Apache Parquet MR (Incubating)
      Copyright 2014 The Apache Software Foundation

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

  (ASLv2) Hortonworks Schema Registry
    The following NOTICE information applies:
      Hortonworks Schema Registry
      Copyright 2016-2017 Hortonworks, Inc.

  (ASLv2) Aggregate Designer
    The following NOTICE information applies:

        Aggregate Designer

        Copyright 2006 - 2013 Pentaho Corporation.  All rights reserved.
        Copyright 2000-2005, 2014-2016 Julian Hyde

  (ASLv2) Classmate
    The following NOTICE information applies
        Java ClassMate library was originally written by Tatu Saloranta (tatu.saloranta@iki.fi)

        Other developers who have contributed code are:

        * Brian Langel

    (ASLv2) Boilerpipe
      The following NOTICE information applies:
          Copyright (c) 2009-2011 Christian Kohlschütter

    (ASLv2) Apache Ivy
        The following NOTICE information applies:
           Copyright 2007-2017 The Apache Software Foundation

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

           Portions of Ivy were originally developed at
           Jayasoft SARL (http://www.jayasoft.fr/)
           and are licensed to the Apache Software Foundation under the
           "Software Grant License Agreement"

           SSH and SFTP support is provided by the JCraft JSch package,
           which is open source software, available under
           the terms of a BSD style license.
           The original software and related information is available
           at http://www.jcraft.com/jsch/.

    (ASLv2) DataStax Java Driver for Apache Cassandra - Core
        The following NOTICE information applies:
          DataStax Java Driver for Apache Cassandra - Core
          Copyright (C) 2012-2017 DataStax Inc.
    (ASLv2) bytebuffer-collections
        The following NOTICE information applies:
          bytebuffer-collections
          Copyright 2011-2015 Metamarkets Group Inc.

    (ASLv2) Druid
        The following NOTICE information applies:
          Druid - a distributed column store.
          Copyright 2012-2016 Metamarkets Group Inc.
          Copyright 2015-2016 Yahoo! Inc.
          Copyright 2015-2016 Imply Data, Inc.

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

          This product contains a modified version of Andrew Duffy's java-alphanum library
            * LICENSE:
              * https://github.com/amjjd/java-alphanum/blob/5c036e2e492cc7f3b7bcdebd46b8f9e2a87927e5/LICENSE.txt (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/amjjd/java-alphanum

          This product contains conjunctive normal form conversion code and a variance aggregator algorithm adapted from Apache Hive
            * LICENSE:
              * https://github.com/apache/hive/blob/branch-2.0/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/apache/hive

          This product contains variable length long deserialization code adapted from Apache Lucene
            * LICENSE:
              * https://github.com/apache/lucene-solr/blob/master/lucene/LICENSE.txt (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/apache/lucene-solr

          This product contains a modified version of Metamarkets java-util library
            * LICENSE:
              * https://github.com/metamx/java-util/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/metamx/java-util
            * COMMIT TAG:
              * https://github.com/metamx/java-util/commit/826021f

          This product contains a modified version of TestNG 6.8.7
            * LICENSE:
              * http://testng.org/license/ (Apache License, Version 2.0)
            * HOMEPAGE:
              * http://testng.org/

          This product contains a modified version of Metamarkets bytebuffer-collections library
            * LICENSE:
              * https://github.com/metamx/bytebuffer-collections/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/metamx/bytebuffer-collections
            * COMMIT TAG:
              * https://github.com/metamx/bytebuffer-collections/commit/3d1e7c8

          This product contains SQL query planning code adapted from Apache Calcite
            * LICENSE:
              * https://github.com/apache/calcite/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://calcite.apache.org/

          This product contains a modified version of Metamarkets extendedset library
            * LICENSE:
              * https://github.com/metamx/extendedset/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/metamx/extendedset
            * COMMIT TAG:
              * https://github.com/metamx/extendedset/commit/c9d647d

          This product contains a modified version of Alessandro Colantonio's CONCISE
          (COmpressed 'N' Composable Integer SEt) library, extending the functionality of
          ConciseSet to use IntBuffers.
            * (c) 2010 Alessandro Colantonio
            * <mailto:colanton@mat.uniroma3.it>
            * <http://ricerca.mat.uniroma3.it/users/colanton>
            * LICENSE:
              * Apache License, Version 2.0
            * HOMEPAGE:
              * https://sourceforge.net/projects/concise/

          This product contains a modified version of The Guava Authors's Closer class from Guava library:
           * LICENSE:
             * https://github.com/google/guava/blob/c462d69329709f72a17a64cb229d15e76e72199c/COPYING (Apache License, Version 2.0)
           * HOMEPAGE:
             * https://github.com/google/guava
           * COMMIT TAG:
             * https://github.com/google/guava/blob/c462d69329709f72a17a64cb229d15e76e72199c

          This product contains code adapted from Apache Hadoop
            * LICENSE:
              * https://github.com/apache/hadoop/blob/trunk/LICENSE.txt (Apache License, Version 2.0)
            * HOMEPAGE:
              * http://hadoop.apache.org/

      (ASLv2) Emitter
        The following NOTICE information applies:
          emitter
          Copyright 2012-2015 Metamarkets Group Inc.

      (ASLv2) Finagle
        The following NOTICE information applies:
          Copyright 2017, Twitter Inc.
          This software contains portions of code from other open-source projects, including:
          >>>>>>>>>>>>>>
          Apache Thrift
          Copyright 2006-2010 The Apache Software Foundation.

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

  (ASLv2) java-util
    The following NOTICE information applies:
       java-util
       Copyright 2011-2017 Metamarkets Group Inc.

  (ASLv2) jdbi
    The following NOTICE information applies:
      This product includes software developed by Brian McCallister

  (ASLv2) Joda Convert
       The following NOTICE information applies:
         Joda Convert
         Copyright 2010-present Stephen Colebourne

         This product includes software developed by
         Joda.org (http://www.joda.org/).


         Joda-Convert includes code from Google Guava, which is licensed as follows:

         Copyright (C) 2011 The Guava Authors

         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.

  (ASLv2) loglady
    The following NOTICE information applies:
       Copyright (c) 2013 Daniel Lundin

  (ASLv2) scala_util
    The following NOTICE information applies:
      Copyright 2012 Metamarkets Group Inc.

  (ASLv2) server-metrics
    The following NOTICE information applies:
      server-metrics
      Copyright 2011-2015 Metamarkets Group Inc.

  (ASLv2) simple-syslog-5424
    The following NOTICE information applies:

        simple-syslog-5424
        https://github.com/palindromicity/simple-syslog-5424

        Copyright 2018 simple-syslog-5424 authors.

  (ASLv2) Audience Annotations
    The following NOTICE information applies:
      Apache Yetus
      Copyright 2008-2018 The Apache Software Foundation

  (ASLv2) sshj
    The following NOTICE information applies:

      sshj - SSHv2 library for Java
      Copyright 2010-2012 sshj contributors

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

      - Apache MINA SSHD
      - Apache Commons-Net

  (ASLv2) Nimbus Language Tags
      The following NOTICE information applies:
        Nimbus Language Tags
        Copyright 2012-2016, Connect2id Ltd.

  (ASLv2) Nimbus OAuth 2.0 SDK with OpenID Connect extensions
    The following NOTICE information applies:
      Nimbus OAuth 2.0 SDK with OpenID Connect extensions
      Copyright 2012-2020, Connect2id Ltd and contributors.

  (ASLv2) Okio
    The following NOTICE information applies:
      Okio
      Copyright 2013 Square, Inc.

  (ASLv2) Apache Qpid Proton-J
    The following NOTICE information applies:
      Apache Qpid Proton-J
      Copyright 2012-2020 The Apache Software Foundation

  (ASLv2) Retrofit
    The following NOTICE information applies:
      Retrofit
      Copyright 2013 Square, Inc.

  (ASLv2) RxJava
    The following NOTICE information applies:
      RxJava
      Copyright (c) 2016-present, RxJava Contributors.

  (ASLv2) ASM Based Accessors Helper Used By JSON Smart (net.minidev:accessors-smart:jar:1.2 - http://www.minidev.net/)
    The following NOTICE information applies:
      ASM Based Accessors Helper Used By JSON Smart 1.2
      Copyright 2017, Uriel Chemouni

  (ASLv2) Adapter: RxJava (com.squareup.retrofit2:adapter-rxjava:jar:2.6.2)
    The following NOTICE information applies:
      Adapter: RxJava 2.6.2
      Copyright 2019, Jake Wharton

  (ASLv2) BCrypt Password Hashing Function (at.favre.lib:bcrypt:jar:0.9.0 - https://github.com/patrickfav/bcrypt)
    The following NOTICE information applies:
      BCrypt Password Hashing Function 0.9.0
      Copyright 2018 Patrick Favre-Bulle

  (ASLv2) Bytes Utility Library (at.favre.lib:bytes:jar:1.3.0 - https://github.com/patrickfav/bytes-java)
    The following NOTICE information applies:
      Bytes Utility Library 1.3.0
      Copyright 2017 Patrick Favre-Bulle

  (ASLv2) Converter: Jackson (com.squareup.retrofit2:converter-jackson:jar:2.5.0)
    The following NOTICE information applies:
      Converter: Jackson 2.5.0
      Copyright 2018, Jake Wharton

  (ASLv2) Nimbus JOSE+JWT (com.nimbusds:nimbus-jose-jwt:jar:6.0.1 - https://bitbucket.org/connect2id/nimbus-jose-jwt)
    The following NOTICE information applies:
      Nimbus JOSE+JWT 6.0.1
      Copyright 2018, Connect2id Ltd.

  (ASLv2) OkHttp Logging Interceptor (com.squareup.okhttp3:logging-interceptor:jar:3.12.2)
    The following NOTICE information applies:
      OkHttp Logging Interceptor 3.12.2
      Copyright 2019 Square, Inc.

  (ASLv2) OkHttp (com.squareup.okhttp3:okhttp:jar:3.12.6)
    The following NOTICE information applies:
      OkHttp 3.12.6
      Copyright 2019 Square, Inc.

  (ASLv2) OkHttp URLConnection (com.squareup.okhttp3:okhttp-urlconnection:jar:3.12.2)
    The following NOTICE information applies:
      OkHttp 3.12.2
      Copyright 2019 Square, Inc.

  (ASLv2) Woodstox (com.fasterxml.woodstox:woodstox-core:jar:6.1.1 - https://github.com/FasterXML/woodstox)
    The following NOTICE information applies:
      Woodstox Core 6.1.1
      Copyright 2015, FasterXML, LLC

  (ASLv2) Non Blocking Reactive Foundation For The JVM (io.projectreactor:reactor-core:jar:3.3.5.RELEASE - https://github.com/reactor/reactor-core)
    The following NOTICE information applies:
      Non Blocking Reactive Foundation For The JVM
      Copyright 2020, Project Reactor

  (ASLv2) Reactive Streams Netty Driver (io.projectreactor.netty:reactor-netty:jar:0.9.7.RELEASE - https://github.com/reactor/reactor-netty)
    The following NOTICE information applies:
       Reactive Streams Netty Driver
       Copyright 2020, Project Reactor

  (ALSv2) smbj
    The following NOTICE information applies:
      Copyright (C)2016 - SMBJ Contributors

  (ASLv2) asn-one
    The following NOTICE information applies:
      Copyright 2016 Jeroen van Erp <jeroen@hierynomus.com>

  (ASLv2) Apache Ftplet API
    The following NOTICE information applies:
      Apache Ftplet API 1.1.1
      Copyright 2003-2017 The Apache Software Foundation

  (ASLv2) Apache FtpServer Core
    The following NOTICE information applies:
      Apache FtpServer Core 1.1.1
      Copyright 2003-2017 The Apache Software Foundation

  (ASLv2) Zip4j
    The following NOTICE information applies:
      Zip4j 2
      Copyright 2021 Srikanth Reddy Lingala

  (ASLv2) QuestDB (org.questdb:core:core-4.2.1.jar - https://github.com/questdb/questdb)
    The following NOTICE information applies:
      Copyright (c) 2014-2019 Appsicle
      Copyright (c) 2019-2020 QuestDB

************************
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-client (org.glassfish.jersey.core:jersey-client:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-common (org.glassfish.jersey.core:jersey-common:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-container-servlet-core (org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-entity-filtering (org.glassfish.jersey.ext:jersey-entity-filtering:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-hk2 (org.glassfish.jersey.inject:jersey-hk2:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-jaxb (org.glassfish.jersey.media:jersey-media-jaxb:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-json-jackson (org.glassfish.jersey.media:jersey-media-json-jackson:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-server (org.glassfish.jersey.core:jersey-server:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2 (org.glassfish.hk2:hk2:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-api (org.glassfish.hk2:hk2-api:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-utils (org.glassfish.hk2:hk2-utils:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-locator (org.glassfish.hk2:hk2-locator:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-config (org.glassfish.hk2:hk2-config:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-core (org.glassfish.hk2:hk2-core:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-runlevel (org.glassfish.hk2:hk2-runlevel:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) config-types (org.glassfish.hk2:config-types:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) class-model (org.glassfish.hk2:class-model:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) asm-all-repackaged (org.glassfish.hk2.external:asm-all-repackaged:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) aopalliance-repackaged (org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (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) jersey-client (org.glassfish.jersey.core:jersey-client:jar:2.19 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-common (org.glassfish.jersey.core:jersey-common:jar:2.19 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-guava (org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.19 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (org.glassfish.jersey.core:jersey-client:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-common (org.glassfish.jersey.core:jersey-common:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-guava (org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (com.sun.jersey:jersey-client:jar:1.9 - https://jersey.java.net/jersey-client/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-core (com.sun.jersey:jersey-core:jar:1.9 - https://jersey.java.net/jersey-core/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-json (com.sun.jersey:jersey-json:jar:1.9 - https://jersey.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-server (com.sun.jersey:jersey-server:jar:1.9 - https://jersey.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-guice (com.sun.jersey.contribs:jersey-guice:jar:1.9 - https://jersey.java.net/)


    (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) 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) javax.ws.rs-api (javax.ws.rs:javax.ws.rs-api:jar:2.1 - http://jax-rs-spec.java.net)

    (CDDL 1.1) (GPL2 w/ CPE) JavaBeans Activation Framework API (javax.activation:javax.activation-api:jar:1.2.0)
    (CDDL 1.1) (GPL2 w/ CPE) JavaMail API (com.sun.mail:javax.mail:jar:1.6.1)
    (CDDL 1.1) (GPL2 w/ CPE) JAXB API (javax.xml.bind:jaxb-api:jar:2.3.0)
    (CDDL 1.1) (GPL 1.1) Old JAXB Core (com.sun.xml.bind:jaxb-core:jar:2.3.0)
    (CDDL 1.1) (GPL 1.1) Old JAXB Runtime (com.sun.xml.bind:jaxb-impl:jar:2.3.0)

************************
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) JHighlight (org.codelibs:jhighlight:1.0.2 - https://github.com/codelibs/jhighlight)
    (CDDL 1.0) Javax Transaction API (javax.transaction:transaction-api:jar:1.1 - no url available)

************************
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) Model-Driven Health Tools ( org.openehealth.ipf.oht.mdht ) https://projects.eclipse.org/proposals/model-driven-health-tools
    (EPL 1.0) AspectJ Weaver (org.aspectj:aspectjweaver:jar:1.9.6 - http://www.eclipse.org/aspectj/)
    (EPL 1.0) AspectJ Runtime (org.aspectj:aspectjrt:jar:1.9.6 - 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.2.3 - http://logback.qos.ch/)
    (EPL 1.0)(LGPL 2.1) Logback Core (ch.qos.logback:logback-core:jar:1.2.3 - http://logback.qos.ch/)
    (EPLv1.0)(GPL 2)(LGPL 2.1) JRuby (org.jruby:jruby-complete:9.1.9.0 - http://jruby.org).
    (EPL 1.0) Eclipse Paho MQTT Client (org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0 - 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/)
    (EPL 1.0) JaCoCo Java Code Coverage Library ( org.jacoco ) http://www.eclemma.org/jacoco
    (EPLv1.0) Clojure (org.clojure:clojure:1.8.0 - http://clojure.org)

************************
Eclipse Public License 2.0
************************

The following binary components are provided under the Eclipse Public License 2.0.

    (EPL 2.0) Jakarta Mail API (jakarta.mail:jakarta.mail-api:jar:2.0.1)
    (EPL 2.0) Jakarta Mail (com.sun.mail:jakarta.mail:jar:2.0.1)

************************
Eclipse Distribution License 1.0
************************

The following binary components are provided under the Eclipse Distribution License 1.0.

    (EDL 1.0) Jakarta Activation API (jakarta.activation:jakarta.activation-api:jar:2.0.1)
    (EDL 1.0) Jakarta Activation (com.sun.activation:jakarta.activation:jar:2.0.1)
    (EDL 1.0) Jakarta XML Binding API (jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2)

*****************
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/)
    (MPL 2.0) Rhino (org.mozilla:rhino:jar:1.7R5 - https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino/Download_Rhino)

*****************
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/)

*****************
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)
    (CC0v1.0) Reactive Streams (org.reactivestreams:reactive-streams:jar:1.0.3 - http://www.reactive-streams.org/)

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

The following binary components are provided under the SIL Open Font License 1.1
  (SIL OFL 1.1) FontAwesome (4.7.0 - https://fontawesome.com/license/free)
