nifi-standard-nar
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 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 Apache Calcite available under Apache Software License V2.  Portions of code found in 
  https://github.com/apache/calcite/blob/master/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java
  and 
  https://github.com/apache/calcite/blob/master/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableScan.java
  Copyright 2012-2017 The Apache Software Foundation
  The code can be found in nifi-nar-bundles/nifi-standard-nar/nifi-standard-processors/../FlowFileProjectTableScanRule
  and nifi-nar-bundles/nifi-standard-nar/nifi-standard-processors/../FlowFileTableScan

******************
Apache Software License v2
******************

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

  (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 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 Net
    The following NOTICE information applies:
      Apache Commons Net
      Copyright 2001-2013 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 HttpComponents
    The following NOTICE information applies:
      Apache HttpClient
      Copyright 1999-2015 The Apache Software Foundation
      
      Apache HttpCore
      Copyright 2005-2015 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 Commons Logging
    The following NOTICE information applies:
      Apache Commons Logging
      Copyright 2003-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) Yammer Metrics
    The following NOTICE information applies:
      Metrics
      Copyright 2010-2012 Coda Hale and Yammer, Inc.

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

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

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

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

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

  (ASLv2) Jolt
    The following NOTICE information applies:
      Copyright 2013-2014 Bazaarvoice, Inc

  (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 Tika
    The following NOTICE information applies:
      Apache Tika Core
      Copyright 2007-2015 The Apache Software Foundation

  (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 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) 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) 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.
		
		The web site includes files generated by Jekyll.

  (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) 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) sshj
    The following NOTICE information applie:

      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) 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) Apache MINA Core
    The following NOTICE information applies:
      Apache MINA Core 2.0.16
      Copyright 2004-2016 Apache MINA Project

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

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

    (CDDL 1.1) (GPL2 w/ CPE) jersey-core (com.sun.jersey:jersey-core:jar:1.19 - https://jersey.java.net/jersey-core/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (com.sun.jersey:jersey-client:jar:1.19 - https://jersey.java.net/jersey-client/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-server (com.sun.jersey:jersey-server:jar:1.19 - https://jersey.java.net/jersey-server/)
    (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) 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) javax.ws.rs-api (javax.ws.rs:javax.ws.rs-api:jar:2.1 - http://jax-rs-spec.java.net)

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

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

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

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