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) JavaMail API (compat) (javax.mail:mail:jar:1.4.7 - http://kenai.com/projects/javamail/mail)
    (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)

*****************
Common Development and Distribution License v1.0:
*****************

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

    (CDDL 1.0) JavaBeans Activation Framework (JAF) (javax.activation:activation:jar:1.1 - http://java.sun.com/products/javabeans/jaf/index.jsp)

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



