nifi-registry-aws-extensions
Copyright 2019 The Apache Software Foundation

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

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

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

  (ASLv2) AWS SDK for Java 2.0
      The following NOTICE information applies:
        Copyright 2010-2019 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.

        The licenses for these third party components are included in LICENSE.txt

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

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

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

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

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

  (ASLv2) Apache HttpComponents Core
      The following NOTICE information applies:
        Copyright 2005-2019 The Apache Software Foundation

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

  (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) 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:

          * NOTICE:
            * license/NOTICE.harmony.txt
          * 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 the Maven wrapper scripts from 'Maven Wrapper', that provides an easy way to ensure a user has everything necessary to run the Maven build.

          * LICENSE:
            * license/LICENSE.mvn-wrapper.txt (Apache License 2.0)
          * HOMEPAGE:
        * https://github.com/takari/maven-wrapper

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

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

    (CC0v1.0) Reactive Streams (org.reactivestreams:reactive-streams:jar:1.0.2 - https://github.com/reactive-streams/reactive-streams-jvm)
