Apache Flink
Copyright 2014-2019 The Apache Software Foundation

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

This project bundles the following dependencies under the Apache Software License 2.0. (http://www.apache.org/licenses/LICENSE-2.0.txt)

- nvd3#1.8.4

This project bundles the following dependencies under the MIT license. (https://opensource.org/licenses/MIT)
See bundled license files for details.

- angular:1.4.8
- angular-drag-and-drop-list:1.4.0
- angular-moment:0.10.3
- angular-ui-router:0.2.15
- bootstrap:3.3.6
- dagre:0.7.5
- dagre-d3:0.4.17
- ev-emitter:1.1.1
- font-awesome:4.5.0 (CSS)
- graphlib:1.0.7
- imagesloaded:4.1.4
- jquery:2.2.0
- lodash:3.10.1
- moment:2.10.6
- moment-duration-format:1.3.0
- qtip2:2.2.1
- Split.js:1.0.6

This project bundles the following dependencies under the BSD license.
See bundled license files for details.

- d3:3.5.12
- cloudpickle:1.2.2
- net.sf.py4j:py4j:0.10.8.1

This project bundles the following dependencies under SIL OFL 1.1 license (https://opensource.org/licenses/OFL-1.1).
See bundled license files for details.

- font-awesome:4.5.0 (Font) (http://fortawesome.github.io/Font-Awesome/) - Created by Dave Gandy
    -> fonts in "flink-runtime-web/web-dashboard/web/fonts"
    -> fonts in "docs/page/font-awesome/fonts"

The Apache Flink project contains or reuses code that is licensed under the ISC license from the following projects.

- simplejmx (http://256stuff.com/sources/simplejmx/) Copyright (c) - Gray Watson

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby
granted, provided that this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
DIRECT, 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 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
USE OR PERFORMANCE OF THIS SOFTWARE.
