You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fluss.apache.org by ja...@apache.org on 2026/09/17 11:10:48 UTC
(fluss) branch release-1.0 updated (573ce8c55 -> 97b213a3d)
This is an automated email from the ASF dual-hosted git repository.
wuchong pushed a change to branch release-1.0
in repository https://gitbox.apache.org/repos/asf/fluss.git
from 573ce8c55 [rust] Validate nested ROW field names (#4209) (#4399)
new f2389caca [license] Bundle the InfluxDB client MIT license
new 6f13a4b22 [license] Correct bundled Protobuf license declarations
new 95612884c [license] Propagate bundled dependency notices
new 3cc37f5a4 [license] Retain notices for copied Arrow Spark and Netty code
new 427c62720 [license] Synchronize the copied source license inventory
new eac734e93 [license] Preserve licenses of code embedded in Rust crates
new 97b213a3d [license] Ship licenses for statically linked Rust dependencies
The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.github/workflows/gateway-ci.yml | 6 +-
.github/workflows/python-release.yml | 42 +-
.github/workflows/rust-license-and-format.yml | 7 +
LICENSE | 49 +-
LICENSE-bin | 39 +-
NOTICE | 18 +
NOTICE-bin | 45 +-
fluss-gateway/LICENSE-bin | 286 ++++--
fluss-gateway/scripts/generate_binary_license.py | 384 +-------
.../scripts/test_generate_binary_license.py | 81 ++
.../src/main/resources/META-INF/NOTICE | 14 +-
.../META-INF/licenses/LICENSE.influxdb3-java | 12 +-
.../META-INF/licenses/LICENSE.protobuf-java | 0
fluss-rust/.licenserc.yaml | 2 +
fluss-rust/bindings/python/DEVELOPMENT.md | 19 +
.../bindings/python}/LICENSE-bin | 985 +++++++++++----------
.../bindings/python}/NOTICE-bin | 13 +-
.../bindings/python/generate_binary_license.py | 75 ++
fluss-rust/bindings/python/pyproject.toml | 2 +-
.../releasing/generate_rust_license.py | 155 ++--
tools/releasing/test_generate_rust_license.py | 97 ++
21 files changed, 1313 insertions(+), 1018 deletions(-)
create mode 100644 fluss-gateway/scripts/test_generate_binary_license.py
copy fluss-filesystems/fluss-fs-gs/src/main/resources/META-INF/licenses/LICENSE.animal-sniffer => fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/licenses/LICENSE.influxdb3-java (87%)
copy {fluss-filesystems/fluss-fs-gs => fluss-metrics/fluss-metrics-influxdb}/src/main/resources/META-INF/licenses/LICENSE.protobuf-java (100%)
copy {fluss-gateway => fluss-rust/bindings/python}/LICENSE-bin (88%)
copy {fluss-gateway => fluss-rust/bindings/python}/NOTICE-bin (57%)
create mode 100644 fluss-rust/bindings/python/generate_binary_license.py
copy fluss-gateway/scripts/generate_binary_license.py => tools/releasing/generate_rust_license.py (73%)
mode change 100755 => 100644
create mode 100644 tools/releasing/test_generate_rust_license.py
(fluss) 03/07: [license] Propagate bundled dependency notices
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
wuchong pushed a commit to branch release-1.0
in repository https://gitbox.apache.org/repos/asf/fluss.git
commit 95612884ca81158296ba1776ad4ee3e0018405f5
Author: Jark Wu <ja...@apache.org>
AuthorDate: Thu Sep 17 15:37:07 2026 +0800
[license] Propagate bundled dependency notices
NOTICE-bin did not propagate the Scala EPFL and Lightbend attributions or
the Commons Math Orekit attribution, and omitted notices for compiled
code copied from Apache projects. Include the relevant attributions in
the top-level binary NOTICE.
Paimon 2.0.0 bundles Scala 2.12.18 although its embedded NOTICE lists
2.12.15. Correct the distributed attribution in the top-level NOTICE
while preserving the upstream Paimon JAR.
Co-Authored-By: Codex <no...@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 45/45
AI-Contributed/UT: 0/0
---
NOTICE-bin | 45 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 44 insertions(+), 1 deletion(-)
diff --git a/NOTICE-bin b/NOTICE-bin
index b943e310a..4b1f7aa93 100644
--- a/NOTICE-bin
+++ b/NOTICE-bin
@@ -355,4 +355,47 @@ This product bundles Jackson JSON processor with the following in its NOTICE:
| in some artifacts (usually source distributions); but is always available
| from the source code management (SCM) system project uses.
-------------------------------------------------------------------------------------
\ No newline at end of file
+------------------------------------------------------------------------------------
+
+This product includes code from the following Apache projects:
+
+Apache Flink
+Copyright 2014-2024 The Apache Software Foundation
+
+Apache Kafka
+Copyright 2012-2024 The Apache Software Foundation
+
+Apache Paimon
+Copyright 2023-2024 The Apache Software Foundation
+
+Apache Arrow Java
+Copyright 2016-2025 The Apache Software Foundation
+
+Apache Spark
+Copyright 2014 and onwards The Apache Software Foundation.
+
+------------------------------------------------------------------------------------
+
+Apache Commons Math
+Copyright 2001-2016 The Apache Software Foundation
+
+This product includes software developed for Orekit by
+CS Systèmes d'Information (http://www.c-s.fr/)
+Copyright 2010-2012 CS Systèmes d'Information
+
+------------------------------------------------------------------------------------
+
+Paimon 2.0.0 bundles scala-library, scala-reflect and scala-compiler 2.12.18.
+The 2.12.15 versions listed in paimon-codegen/META-INF/NOTICE in the upstream
+paimon-bundle-2.0.0.jar are outdated. The following notice applies to the
+bundled Scala 2.12.18 code:
+
+Scala
+Copyright (c) 2002-2023 EPFL
+Copyright (c) 2011-2023 Lightbend, Inc.
+
+Scala includes software developed at
+LAMP/EPFL (https://lamp.epfl.ch/) and
+Lightbend, Inc. (https://www.lightbend.com/).
+
+------------------------------------------------------------------------------------
(fluss) 01/07: [license] Bundle the InfluxDB client MIT license
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
wuchong pushed a commit to branch release-1.0
in repository https://gitbox.apache.org/repos/asf/fluss.git
commit f2389cacaa8a438df85378a780ee08faac2fa3ec
Author: Jark Wu <ja...@apache.org>
AuthorDate: Thu Sep 17 15:36:20 2026 +0800
[license] Bundle the InfluxDB client MIT license
The influxdb3-java 1.8.0 is MIT licensed, but the
InfluxDB reporter classified it as Apache-2.0 and omitted the InfluxData
copyright and permission text. Include the upstream MIT license in the
shaded plugin JAR, reproduce it in LICENSE-bin with a package-local pointer,
and move the dependency declaration from the Apache NOTICE group to a
separate MIT group, preserving the module dependency inventory.
Co-Authored-By: Codex <no...@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 57/57
AI-Contributed/UT: 0/0
---
LICENSE-bin | 30 ++++++++++++++++++++++
.../src/main/resources/META-INF/NOTICE | 6 ++++-
.../META-INF/licenses/LICENSE.influxdb3-java | 21 +++++++++++++++
3 files changed, 56 insertions(+), 1 deletion(-)
diff --git a/LICENSE-bin b/LICENSE-bin
index 24ccd6093..5616dec88 100644
--- a/LICENSE-bin
+++ b/LICENSE-bin
@@ -1171,3 +1171,33 @@ Project URL: https://www.joda.org/joda-time/
License: Apache License 2.0 - https://www.apache.org/licenses/LICENSE-2.0.txt
------------------------------------------------------------------------------------
+
+This product bundles InfluxDB 3 Java Client 1.8.0.
+Project URL: https://github.com/InfluxCommunity/influxdb3-java
+License: MIT
+The license is also included at META-INF/licenses/LICENSE.influxdb3-java in
+plugins/influxdb/fluss-metrics-influxdb-*.jar.
+
+| MIT License
+|
+| Copyright (c) 2023 InfluxData Inc.
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+
+------------------------------------------------------------------------------------
diff --git a/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/NOTICE b/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/NOTICE
index 0ff27d6c8..3f5a5e367 100644
--- a/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/NOTICE
+++ b/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/NOTICE
@@ -15,7 +15,6 @@ This project bundles the following dependencies under the Apache Software Licens
- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
- com.google.protobuf:protobuf-java-util:4.30.2
- com.google.protobuf:protobuf-java:4.33.5
-- com.influxdb:influxdb3-java:1.8.0
- io.grpc:grpc-api:1.71.0
- io.grpc:grpc-context:1.71.0
- io.grpc:grpc-core:1.71.0
@@ -54,3 +53,8 @@ This project bundles the following dependencies under the Apache Software Licens
- org.apache.arrow:arrow-vector:18.3.0
- org.apache.arrow:flight-core:18.3.0
- org.codehaus.mojo:animal-sniffer-annotations:1.24
+
+This project bundles the following dependencies under the MIT License.
+See META-INF/licenses/LICENSE.influxdb3-java for the license text.
+
+- com.influxdb:influxdb3-java:1.8.0
diff --git a/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/licenses/LICENSE.influxdb3-java b/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/licenses/LICENSE.influxdb3-java
new file mode 100644
index 000000000..bc35d8867
--- /dev/null
+++ b/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/licenses/LICENSE.influxdb3-java
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 InfluxData Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
(fluss) 06/07: [license] Preserve licenses of code embedded in Rust crates
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
wuchong pushed a commit to branch release-1.0
in repository https://gitbox.apache.org/repos/asf/fluss.git
commit eac734e931e9f9ee15b9c25ad3217c5b96f1f255
Author: Jark Wu <ja...@apache.org>
AuthorDate: Thu Sep 17 15:37:16 2026 +0800
[license] Preserve licenses of code embedded in Rust crates
Selecting Apache-2.0 for a crate returned before
collecting separately licensed embedded code. Treat the reviewed Zstandard
C library, generated bindings and regex Unicode tables independently of
the crate-level SPDX choice, and fail if their license paths disappear
after a dependency update. Regenerate Gateway LICENSE-bin and add
regressions for preserved texts, missing files and MIT-only crates.
Co-Authored-By: Codex <no...@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 313/313
AI-Contributed/UT: 81/81
---
fluss-gateway/LICENSE-bin | 286 +++++++++++++++------
fluss-gateway/scripts/generate_binary_license.py | 27 +-
.../scripts/test_generate_binary_license.py | 81 ++++++
3 files changed, 318 insertions(+), 76 deletions(-)
diff --git a/fluss-gateway/LICENSE-bin b/fluss-gateway/LICENSE-bin
index 0c35b9d00..6b388d2d4 100644
--- a/fluss-gateway/LICENSE-bin
+++ b/fluss-gateway/LICENSE-bin
@@ -212,7 +212,8 @@ the other architecture's executable.
The supported Linux Gateway binaries include the following Rust crates
under the Apache License, Version 2.0. Crates with additional conjunctive
-license obligations are also reproduced in the sections below.
+license obligations or incorporated components with separate licenses
+are also reproduced in the sections below.
ahash@0.8.12
anstream@1.0.0
@@ -389,37 +390,37 @@ zstd-sys@2.0.16+zstd.1.5.7
The supported Linux Gateway binaries use the Rust crate aho-corasick@1.1.5.
Project URL: https://github.com/BurntSushi/aho-corasick
Declared license: Unlicense OR MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate byteorder@1.5.0.
Project URL: https://github.com/BurntSushi/byteorder
Declared license: Unlicense OR MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate csv@1.4.0.
Project URL: https://github.com/BurntSushi/rust-csv
Declared license: Unlicense/MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate csv-core@0.1.13.
Project URL: https://github.com/BurntSushi/rust-csv
Declared license: Unlicense/MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate jiff@0.2.35.
Project URL: https://github.com/BurntSushi/jiff
Declared license: Unlicense OR MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate jiff-core@0.1.0.
Project URL: https://github.com/BurntSushi/jiff/tree/master/crates/jiff-core
Declared license: Unlicense OR MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate memchr@2.8.3.
Project URL: https://github.com/BurntSushi/memchr
Declared license: Unlicense OR MIT
-Selected license obligations: MIT
+Selected crate license: MIT
These crates ship identical license text, reproduced once below.
@@ -450,7 +451,7 @@ License file: LICENSE-MIT
The supported Linux Gateway binaries use the Rust crate arrow-array@59.2.0.
Project URL: https://github.com/apache/arrow-rs
Declared license: Apache-2.0 AND MIT
-Selected license obligations: Apache-2.0 AND MIT
+Selected crate license: Apache-2.0 AND MIT
License file: LICENSE-MIT
| MIT License
@@ -479,7 +480,7 @@ License file: LICENSE-MIT
The supported Linux Gateway binaries use the Rust crate atoi@2.0.0.
Project URL: https://github.com/pacman82/atoi-rs
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| MIT License
@@ -508,7 +509,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate axum@0.8.9.
Project URL: https://github.com/tokio-rs/axum
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| Copyright (c) 2019 axum Contributors
@@ -541,7 +542,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate axum-core@0.5.6.
Project URL: https://github.com/tokio-rs/axum
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| MIT License
@@ -576,12 +577,12 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate bitvec@1.1.1.
Project URL: https://bitvecto-rs.github.io/bitvec
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate wyz@0.5.1.
Project URL: https://myrrlyn.net/crates/wyz
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
These crates ship identical license text, reproduced once below.
@@ -612,7 +613,7 @@ License file: LICENSE.txt
The supported Linux Gateway binaries use the Rust crate bytes@1.12.1.
Project URL: https://github.com/tokio-rs/bytes
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| Copyright (c) 2018 Carl Lerche
@@ -645,7 +646,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate dashmap@6.2.1.
Project URL: https://github.com/xacrimon/dashmap
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| MIT License
@@ -674,7 +675,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate foldhash@0.2.0.
Project URL: https://github.com/orlp/foldhash
Declared license: Zlib
-Selected license obligations: Zlib
+Selected crate license: Zlib
License file: LICENSE
| Copyright (c) 2024 Orson Peters
@@ -701,7 +702,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate funty@2.0.0.
Project URL: https://github.com/myrrlyn/funty
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE.txt
| MIT License
@@ -730,7 +731,7 @@ License file: LICENSE.txt
The supported Linux Gateway binaries use the Rust crate generic-array@0.14.7.
Project URL: https://github.com/fizyk20/generic-array.git
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| The MIT License (MIT)
@@ -759,12 +760,12 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate http-body@1.1.0.
Project URL: https://github.com/hyperium/http-body
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate http-body-util@0.1.5.
Project URL: https://github.com/hyperium/http-body
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
These crates ship identical license text, reproduced once below.
@@ -799,7 +800,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate hyper@1.11.0.
Project URL: https://hyper.rs
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| Copyright (c) 2014-2026 Sean McArthur
@@ -826,7 +827,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate hyper-util@0.1.20.
Project URL: https://hyper.rs
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| Copyright (c) 2023-2025 Sean McArthur
@@ -853,77 +854,77 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate icu_collections@2.1.1.
Project URL: https://icu4x.unicode.org
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate icu_locale_core@2.1.1.
Project URL: https://icu4x.unicode.org
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate icu_normalizer@2.1.1.
Project URL: https://icu4x.unicode.org
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate icu_normalizer_data@2.1.1.
Project URL: https://icu4x.unicode.org
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate icu_properties@2.1.2.
Project URL: https://icu4x.unicode.org
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate icu_properties_data@2.1.2.
Project URL: https://icu4x.unicode.org
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate icu_provider@2.1.1.
Project URL: https://icu4x.unicode.org
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate litemap@0.8.2.
Project URL: https://github.com/unicode-org/icu4x
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate potential_utf@0.1.5.
Project URL: https://icu4x.unicode.org
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate tinystr@0.8.3.
Project URL: https://github.com/unicode-org/icu4x
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate writeable@0.6.3.
Project URL: https://github.com/unicode-org/icu4x
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate yoke@0.8.3.
Project URL: https://github.com/unicode-org/icu4x
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate zerofrom@0.1.8.
Project URL: https://github.com/unicode-org/icu4x
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate zerotrie@0.2.4.
Project URL: https://icu4x.unicode.org
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
The supported Linux Gateway binaries use the Rust crate zerovec@0.11.6.
Project URL: https://github.com/unicode-org/icu4x
Declared license: Unicode-3.0
-Selected license obligations: Unicode-3.0
+Selected crate license: Unicode-3.0
These crates ship identical license text, reproduced once below.
@@ -979,7 +980,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate libm@0.2.16.
Project URL: https://github.com/rust-lang/compiler-builtins
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE.txt
| rust-lang/libm as a whole is available for use under the MIT license:
@@ -1245,7 +1246,7 @@ License file: LICENSE.txt
The supported Linux Gateway binaries use the Rust crate lz4_flex@0.14.0.
Project URL: https://github.com/pseitz/lz4_flex
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| The MIT License (MIT)
@@ -1273,7 +1274,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate matchit@0.8.4.
Project URL: https://github.com/ibraheemdev/matchit
Declared license: MIT AND BSD-3-Clause
-Selected license obligations: MIT AND BSD-3-Clause
+Selected crate license: MIT AND BSD-3-Clause
License file: LICENSE
| MIT License
@@ -1333,17 +1334,17 @@ License file: LICENSE.httprouter
The supported Linux Gateway binaries use the Rust crate metrics@0.24.6.
Project URL: https://github.com/metrics-rs/metrics
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate metrics-exporter-prometheus@0.17.2.
Project URL: https://github.com/metrics-rs/metrics
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate metrics-util@0.20.4.
Project URL: https://github.com/metrics-rs/metrics
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
These crates ship identical license text, reproduced once below.
@@ -1372,7 +1373,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate mio@1.2.2.
Project URL: https://github.com/tokio-rs/mio
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| Copyright (c) 2014 Carl Lerche and other MIO contributors
@@ -1399,7 +1400,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate ordered-float@5.3.0.
Project URL: https://github.com/reem/rust-ordered-float
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE-MIT
| Copyright (c) 2015 Jonathan Reem
@@ -1432,7 +1433,7 @@ License file: LICENSE-MIT
The supported Linux Gateway binaries use the Rust crate quanta@0.12.6.
Project URL: https://github.com/metrics-rs/quanta
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| // Copyright (c) 2019 Nuclear Furnace
@@ -1459,7 +1460,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate quick-xml@0.38.4.
Project URL: https://github.com/tafia/quick-xml
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE-MIT.md
| The MIT License (MIT)
@@ -1490,7 +1491,7 @@ License file: LICENSE-MIT.md
The supported Linux Gateway binaries use the Rust crate radium@0.7.0.
Project URL: https://github.com/bitvecto-rs/radium
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE.txt
| MIT License
@@ -1519,7 +1520,7 @@ License file: LICENSE.txt
The supported Linux Gateway binaries use the Rust crate raw-cpuid@11.6.0.
Project URL: https://github.com/gz/rust-cpuid
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE.md
| The MIT License (MIT)
@@ -1545,10 +1546,75 @@ License file: LICENSE.md
| THE SOFTWARE.
--------------------------------------------------------------------------------
+The supported Linux Gateway binaries use the Rust crate regex-syntax@0.8.11.
+Project URL: https://github.com/rust-lang/regex/tree/master/regex-syntax
+Declared license: MIT OR Apache-2.0
+Selected crate license: Apache-2.0
+
+License file: src/unicode_tables/LICENSE-UNICODE
+| UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+|
+| Unicode Data Files include all data files under the directories
+| http://www.unicode.org/Public/, http://www.unicode.org/reports/,
+| http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and
+| http://www.unicode.org/utility/trac/browser/.
+|
+| Unicode Data Files do not include PDF online code charts under the
+| directory http://www.unicode.org/Public/.
+|
+| Software includes any source code published in the Unicode Standard
+| or under the directories
+| http://www.unicode.org/Public/, http://www.unicode.org/reports/,
+| http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and
+| http://www.unicode.org/utility/trac/browser/.
+|
+| NOTICE TO USER: Carefully read the following legal agreement.
+| BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S
+| DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"),
+| YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
+| TERMS AND CONDITIONS OF THIS AGREEMENT.
+| IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE
+| THE DATA FILES OR SOFTWARE.
+|
+| COPYRIGHT AND PERMISSION NOTICE
+|
+| Copyright © 1991-2018 Unicode, Inc. All rights reserved.
+| Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
+|
+| Permission is hereby granted, free of charge, to any person obtaining
+| a copy of the Unicode data files and any associated documentation
+| (the "Data Files") or Unicode software and any associated documentation
+| (the "Software") to deal in the Data Files or Software
+| without restriction, including without limitation the rights to use,
+| copy, modify, merge, publish, distribute, and/or sell copies of
+| the Data Files or Software, and to permit persons to whom the Data Files
+| or Software are furnished to do so, provided that either
+| (a) this copyright and permission notice appear with all copies
+| of the Data Files or Software, or
+| (b) this copyright and permission notice appear in associated
+| Documentation.
+|
+| THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+| WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+| NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+| IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+| NOTICE BE LIABLE FOR ANY CLAIM, OR 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
+| TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+| PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+|
+| Except as contained in this notice, the name of a copyright holder
+| shall not be used in advertising or otherwise to promote the sale,
+| use or other dealings in these Data Files or Software without prior
+| written authorization of the copyright holder.
+--------------------------------------------------------------------------------
+
The supported Linux Gateway binaries use the Rust crate ring@0.17.14.
Project URL: https://github.com/briansmith/ring
Declared license: Apache-2.0 AND ISC
-Selected license obligations: Apache-2.0 AND ISC
+Selected crate license: Apache-2.0 AND ISC
License file: LICENSE
| *ring* uses an "ISC" license, like BoringSSL used to use, for new code
@@ -2099,7 +2165,7 @@ License file: third_party/fiat/LICENSE
The supported Linux Gateway binaries use the Rust crate rustls-webpki@0.103.14.
Project URL: https://github.com/rustls/webpki
Declared license: ISC
-Selected license obligations: ISC
+Selected crate license: ISC
License file: LICENSE
| Except as otherwise noted, this project is licensed under the following
@@ -2126,7 +2192,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate serde_yaml_ng@0.10.0.
Project URL: https://github.com/acatton/serde-yaml-ng
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| MIT License
@@ -2156,7 +2222,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate slab@0.4.12.
Project URL: https://github.com/tokio-rs/slab
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| Copyright (c) 2019 Carl Lerche
@@ -2189,7 +2255,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate strsim@0.11.1.
Project URL: https://github.com/rapidfuzz/strsim-rs
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| The MIT License (MIT)
@@ -2220,7 +2286,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate strum@0.26.3.
Project URL: https://github.com/Peternator7/strum
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| MIT License
@@ -2249,7 +2315,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate subtle@2.6.1.
Project URL: https://dalek.rs/
Declared license: BSD-3-Clause
-Selected license obligations: BSD-3-Clause
+Selected crate license: BSD-3-Clause
License file: LICENSE
| Copyright (c) 2016-2017 Isis Agora Lovecruft, Henry de Valence. All rights reserved.
@@ -2286,7 +2352,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate tap@1.0.1.
Project URL: https://github.com/myrrlyn/tap
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE.txt
| MIT License
@@ -2315,12 +2381,12 @@ License file: LICENSE.txt
The supported Linux Gateway binaries use the Rust crate tokio@1.53.1.
Project URL: https://tokio.rs
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate tokio-util@0.7.19.
Project URL: https://tokio.rs
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
These crates ship identical license text, reproduced once below.
@@ -2351,17 +2417,17 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate tower@0.5.3.
Project URL: https://github.com/tower-rs/tower
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate tower-layer@0.3.3.
Project URL: https://github.com/tower-rs/tower
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate tower-service@0.3.3.
Project URL: https://github.com/tower-rs/tower
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
These crates ship identical license text, reproduced once below.
@@ -2396,7 +2462,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate tower-http@0.6.11.
Project URL: https://github.com/tower-rs/tower-http
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| Copyright (c) 2019-2021 Tower Contributors
@@ -2429,7 +2495,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate tracing@0.1.44.
Project URL: https://tokio.rs
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| Copyright (c) 2019 Tokio Contributors
@@ -2462,7 +2528,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate tracing-core@0.1.36.
Project URL: https://tokio.rs
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| Copyright (c) 2019 Tokio Contributors
@@ -2518,7 +2584,7 @@ License file: src/spin/LICENSE
The supported Linux Gateway binaries use the Rust crate try-lock@0.2.5.
Project URL: https://github.com/seanmonstar/try-lock
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| Copyright (c) 2018-2023 Sean McArthur
@@ -2546,7 +2612,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate twox-hash@2.1.3.
Project URL: https://github.com/shepmaster/twox-hash
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE.txt
| The MIT License (MIT)
@@ -2575,12 +2641,12 @@ License file: LICENSE.txt
The supported Linux Gateway binaries use the Rust crate unsafe-libyaml@0.2.11.
Project URL: https://github.com/dtolnay/unsafe-libyaml
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
The supported Linux Gateway binaries use the Rust crate zmij@1.0.23.
Project URL: https://github.com/dtolnay/zmij
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
These crates ship identical license text, reproduced once below.
@@ -2613,7 +2679,7 @@ License file: LICENSE-MIT
The supported Linux Gateway binaries use the Rust crate untrusted@0.9.0.
Project URL: https://github.com/briansmith/untrusted
Declared license: ISC
-Selected license obligations: ISC
+Selected crate license: ISC
License file: LICENSE.txt
| // Copyright 2015-2016 Brian Smith.
@@ -2634,7 +2700,7 @@ License file: LICENSE.txt
The supported Linux Gateway binaries use the Rust crate want@0.3.1.
Project URL: https://github.com/seanmonstar/want
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| Copyright (c) 2018-2019 Sean McArthur
@@ -2661,7 +2727,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate webpki-roots@1.0.9.
Project URL: https://github.com/rustls/webpki-roots
Declared license: CDLA-Permissive-2.0
-Selected license obligations: CDLA-Permissive-2.0
+Selected crate license: CDLA-Permissive-2.0
License file: LICENSE
| # Community Data License Agreement - Permissive - Version 2.0
@@ -2730,7 +2796,7 @@ License file: LICENSE
The supported Linux Gateway binaries use the Rust crate zstd@0.13.3.
Project URL: https://github.com/gyscos/zstd-rs
Declared license: MIT
-Selected license obligations: MIT
+Selected crate license: MIT
License file: LICENSE
| The MIT License (MIT)
@@ -2741,3 +2807,75 @@ License file: LICENSE
| The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The supported Linux Gateway binaries use the Rust crate zstd-sys@2.0.16+zstd.1.5.7.
+Project URL: https://github.com/gyscos/zstd-rs
+Declared license: MIT/Apache-2.0
+Selected crate license: Apache-2.0
+
+License file: LICENSE.BSD-3-Clause
+| The auto-generated bindings are under the 3-clause BSD license:
+|
+| BSD License
+|
+| For Zstandard software
+|
+| Copyright (c) 2016-present, Facebook, Inc. All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without modification,
+| are permitted provided that the following conditions are met:
+|
+| * Redistributions of source code must retain the above copyright notice, this
+| list of conditions and the following disclaimer.
+|
+| * Redistributions in binary form must reproduce the above copyright notice,
+| this list of conditions and the following disclaimer in the documentation
+| and/or other materials provided with the distribution.
+|
+| * Neither the name Facebook nor the names of its contributors may be used to
+| endorse or promote products derived from this software without specific
+| prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+| ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+| ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License file: zstd/LICENSE
+| BSD License
+|
+| For Zstandard software
+|
+| Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without modification,
+| are permitted provided that the following conditions are met:
+|
+| * Redistributions of source code must retain the above copyright notice, this
+| list of conditions and the following disclaimer.
+|
+| * Redistributions in binary form must reproduce the above copyright notice,
+| this list of conditions and the following disclaimer in the documentation
+| and/or other materials provided with the distribution.
+|
+| * Neither the name Facebook, nor Meta, nor the names of its contributors may
+| be used to endorse or promote products derived from this software without
+| specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+| ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+| ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/fluss-gateway/scripts/generate_binary_license.py b/fluss-gateway/scripts/generate_binary_license.py
index 9db8f03c5..512b147a3 100755
--- a/fluss-gateway/scripts/generate_binary_license.py
+++ b/fluss-gateway/scripts/generate_binary_license.py
@@ -35,6 +35,14 @@ TARGETS = (
LOCAL_PACKAGES = {"fluss-gateway", "fluss-rs"}
SEPARATOR = "-" * 80
+# These licenses cover incorporated code or data, independently of the crate's
+# top-level SPDX choice. Keep the reviewed paths explicit: a renamed or removed
+# file after a dependency update must trigger a fresh review, not silent omission.
+INCORPORATED_LICENSE_FILES = {
+ "regex-syntax": ("src/unicode_tables/LICENSE-UNICODE",),
+ "zstd-sys": ("LICENSE.BSD-3-Clause", "zstd/LICENSE"),
+}
+
def cargo_metadata(gateway_dir: Path, target: str) -> dict:
command = [
@@ -126,6 +134,20 @@ def license_terms(expression: str) -> Tuple[str, ...]:
def license_files(package: dict, selected_terms: Tuple[str, ...]) -> List[Path]:
+ package_dir = Path(package["manifest_path"]).parent
+ incorporated = []
+ for relative_path in INCORPORATED_LICENSE_FILES.get(package["name"], ()):
+ path = package_dir / relative_path
+ if not path.is_file():
+ raise RuntimeError(
+ f"Missing incorporated license {relative_path} for "
+ f"{package['name']}@{package['version']}; review the updated crate."
+ )
+ incorporated.append(path)
+ return sorted(set(crate_license_files(package, selected_terms) + incorporated))
+
+
+def crate_license_files(package: dict, selected_terms: Tuple[str, ...]) -> List[Path]:
package_dir = Path(package["manifest_path"]).parent
candidates = sorted(
path
@@ -275,7 +297,7 @@ def generate_license(repository_root: Path, packages: Iterable[dict]) -> str:
f"The supported Linux Gateway binaries use the Rust crate {package_name}.",
f"Project URL: {homepage}",
f"Declared license: {expression}",
- f"Selected license obligations: {' AND '.join(selected_terms)}",
+ f"Selected crate license: {' AND '.join(selected_terms)}",
]
reproduction = tuple(
(
@@ -310,7 +332,8 @@ def generate_license(repository_root: Path, packages: Iterable[dict]) -> str:
"",
"The supported Linux Gateway binaries include the following Rust crates",
"under the Apache License, Version 2.0. Crates with additional conjunctive",
- "license obligations are also reproduced in the sections below.",
+ "license obligations or incorporated components with separate licenses",
+ "are also reproduced in the sections below.",
"",
"\n".join(apache_dependencies),
]
diff --git a/fluss-gateway/scripts/test_generate_binary_license.py b/fluss-gateway/scripts/test_generate_binary_license.py
new file mode 100644
index 000000000..8915084e1
--- /dev/null
+++ b/fluss-gateway/scripts/test_generate_binary_license.py
@@ -0,0 +1,81 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+"""Regression checks for licenses of code incorporated into Rust crates."""
+
+import tempfile
+import unittest
+from pathlib import Path
+
+import generate_binary_license as generator
+
+
+class IncorporatedLicenseTest(unittest.TestCase):
+ def setUp(self):
+ self.temporary = tempfile.TemporaryDirectory()
+ self.addCleanup(self.temporary.cleanup)
+ self.root = Path(self.temporary.name)
+ (self.root / "LICENSE").write_text("Apache License\n" + "-" * 80 + "\n")
+
+ def package(self, name, files, license_expression="MIT OR Apache-2.0"):
+ directory = self.root / name
+ directory.mkdir()
+ for filename, contents in files.items():
+ path = directory / filename
+ path.parent.mkdir(parents=True, exist_ok=True)
+ path.write_text(contents)
+ return {
+ "name": name,
+ "version": "1.0.0",
+ "source": "registry",
+ "manifest_path": str(directory / "Cargo.toml"),
+ "license": license_expression,
+ }
+
+ def test_apache_choice_keeps_native_library_and_bindings_licenses(self):
+ package = self.package("zstd-sys", {
+ "LICENSE.BSD-3-Clause": "Bindings copyright and BSD terms",
+ "zstd/LICENSE": "Zstandard copyright and BSD terms",
+ })
+ result = generator.generate_license(self.root, [package])
+ self.assertIn("Bindings copyright and BSD terms", result)
+ self.assertIn("Zstandard copyright and BSD terms", result)
+ self.assertIn("Selected crate license: Apache-2.0", result)
+
+ def test_apache_choice_keeps_unicode_data_license(self):
+ package = self.package("regex-syntax", {
+ "src/unicode_tables/LICENSE-UNICODE": "Unicode data copyright and terms",
+ })
+ result = generator.generate_license(self.root, [package])
+ self.assertIn("Unicode data copyright and terms", result)
+
+ def test_dependency_update_cannot_silently_drop_incorporated_license(self):
+ package = self.package("zstd-sys", {"zstd/LICENSE": "BSD terms"})
+ with self.assertRaisesRegex(RuntimeError, "Missing incorporated license"):
+ generator.generate_license(self.root, [package])
+
+ def test_mit_crate_still_requires_and_preserves_its_license(self):
+ package = self.package("bytes", {"LICENSE": "Carl Lerche MIT terms"}, "MIT")
+ result = generator.generate_license(self.root, [package])
+ self.assertIn("Carl Lerche MIT terms", result)
+ (Path(package["manifest_path"]).parent / "LICENSE").unlink()
+ with self.assertRaisesRegex(RuntimeError, "Cannot locate the MIT text"):
+ generator.generate_license(self.root, [package])
+
+
+if __name__ == "__main__":
+ unittest.main()
(fluss) 07/07: [license] Ship licenses for statically linked Rust dependencies
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
wuchong pushed a commit to branch release-1.0
in repository https://gitbox.apache.org/repos/asf/fluss.git
commit 97b213a3dfe471670deb4c880e5489409613c76c
Author: Jark Wu <ja...@apache.org>
AuthorDate: Thu Sep 17 15:37:19 2026 +0800
[license] Ship licenses for statically linked Rust dependencies
Wheel LICENSE and NOTICE files only described
Fluss source, omitting the terms of statically linked crates such as Tokio
and bytes and the notices of Arrow. Share the Rust dependency collector
with Gateway, generate Python binary legal files from the locked normal
runtime closure, and include them in wheels and source distributions.
Generate platform-specific files before release builds, use --locked, and
check both drift and actual packaged license texts. Test workspace-root
selection and exclusion of build, dev and proc-macro dependencies using a
real Cargo workspace. Verified a CPython 3.12 macOS arm64 wheel and sdist
contain all four legal files and the audited attributions.
Recognize generated binary legal texts in the Rust header-check exclusions,
matching Gateway, while retaining license generation and archive checks.
Co-Authored-By: Codex <no...@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 2/2
AI-Contributed/UT: 0/0
---
.github/workflows/gateway-ci.yml | 6 +-
.github/workflows/python-release.yml | 42 +-
.github/workflows/rust-license-and-format.yml | 7 +
fluss-gateway/scripts/generate_binary_license.py | 407 +--
fluss-rust/.licenserc.yaml | 2 +
fluss-rust/bindings/python/DEVELOPMENT.md | 19 +
fluss-rust/bindings/python/LICENSE-bin | 2774 ++++++++++++++++++++
fluss-rust/bindings/python/NOTICE-bin | 33 +
.../bindings/python/generate_binary_license.py | 75 +
fluss-rust/bindings/python/pyproject.toml | 2 +-
.../releasing/generate_rust_license.py | 128 +-
tools/releasing/test_generate_rust_license.py | 97 +
12 files changed, 3123 insertions(+), 469 deletions(-)
diff --git a/.github/workflows/gateway-ci.yml b/.github/workflows/gateway-ci.yml
index c783dfcd2..c1b7059ad 100644
--- a/.github/workflows/gateway-ci.yml
+++ b/.github/workflows/gateway-ci.yml
@@ -36,6 +36,7 @@ on:
- '.dockerignore'
- 'tools/releasing/create_gateway_release.sh'
- 'tools/releasing/update_branch_version.sh'
+ - 'tools/releasing/*rust_license.py'
- '.github/workflows/gateway-ci.yml'
pull_request:
branches:
@@ -52,6 +53,7 @@ on:
- '.dockerignore'
- 'tools/releasing/create_gateway_release.sh'
- 'tools/releasing/update_branch_version.sh'
+ - 'tools/releasing/*rust_license.py'
- '.github/workflows/gateway-ci.yml'
workflow_dispatch:
@@ -149,7 +151,9 @@ jobs:
git diff --exit-code DEPENDENCIES.rust.tsv
- name: Binary LICENSE and NOTICE drift check
- run: python3 scripts/generate_binary_license.py --check
+ run: |
+ python3 -m unittest discover -s scripts -p 'test_generate_binary_license.py'
+ python3 scripts/generate_binary_license.py --check
- name: Rust Cache
uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml
index fc9ca5081..82ffc0a8f 100644
--- a/.github/workflows/python-release.yml
+++ b/.github/workflows/python-release.yml
@@ -48,6 +48,10 @@ jobs:
needs: [version-check]
steps:
- uses: actions/checkout@v6
+ - uses: dtolnay/rust-toolchain@stable
+
+ - name: Check generated binary licenses
+ run: python fluss-rust/bindings/python/generate_binary_license.py --check
- uses: PyO3/maturin-action@v1
with:
@@ -67,41 +71,45 @@ jobs:
strategy:
matrix:
include:
- - { os: windows-latest }
- - { os: macos-15-intel, target: "x86_64-apple-darwin" }
- - { os: macos-15, target: "aarch64-apple-darwin" }
- - { os: ubuntu-latest, target: "x86_64" }
- - { os: ubuntu-latest, target: "aarch64", manylinux: "manylinux_2_28" }
+ - { os: windows-latest, license-target: "x86_64-pc-windows-msvc" }
+ - { os: macos-15-intel, target: "x86_64-apple-darwin", license-target: "x86_64-apple-darwin" }
+ - { os: macos-15, target: "aarch64-apple-darwin", license-target: "aarch64-apple-darwin" }
+ - { os: ubuntu-latest, target: "x86_64", license-target: "x86_64-unknown-linux-gnu" }
+ - { os: ubuntu-latest, target: "aarch64", manylinux: "manylinux_2_28", license-target: "aarch64-unknown-linux-gnu" }
steps:
- uses: actions/checkout@v6
+ - uses: dtolnay/rust-toolchain@stable
+
+ - name: Generate licenses for this wheel target
+ run: python fluss-rust/bindings/python/generate_binary_license.py --target "${{ matrix.license-target }}"
- uses: PyO3/maturin-action@v1
with:
working-directory: fluss-rust/bindings/python
target: ${{ matrix.target }}
command: build
- args: --release -o dist -i python3.9
+ args: --locked --release -o dist -i python3.9
manylinux: ${{ matrix.manylinux || 'auto' }}
- uses: PyO3/maturin-action@v1
with:
working-directory: fluss-rust/bindings/python
target: ${{ matrix.target }}
command: build
- args: --release -o dist -i python3.10
+ args: --locked --release -o dist -i python3.10
manylinux: ${{ matrix.manylinux || 'auto' }}
- uses: PyO3/maturin-action@v1
with:
working-directory: fluss-rust/bindings/python
target: ${{ matrix.target }}
command: build
- args: --release -o dist -i python3.11
+ args: --locked --release -o dist -i python3.11
manylinux: ${{ matrix.manylinux || 'auto' }}
- uses: PyO3/maturin-action@v1
with:
working-directory: fluss-rust/bindings/python
target: ${{ matrix.target }}
command: build
- args: --release -o dist -i python3.12
+ args: --locked --release -o dist -i python3.12
manylinux: ${{ matrix.manylinux || 'auto' }}
- name: Upload wheels
@@ -126,19 +134,29 @@ jobs:
run: |
SDIST=$(ls dist/*.tar.gz)
PREFIX=$(basename "$SDIST" .tar.gz)
- for f in LICENSE NOTICE; do
+ for f in LICENSE NOTICE LICENSE-bin NOTICE-bin; do
if [ -z "$(tar -xzOf "$SDIST" "${PREFIX}/${f}" 2>/dev/null)" ]; then
echo "Error: ${f} is missing or empty at the root of ${SDIST}"
exit 1
fi
done
for whl in dist/*.whl; do
- for f in LICENSE NOTICE; do
- if ! unzip -p "$whl" "*.dist-info/licenses/${f}" 2>/dev/null | grep -q .; then
+ for f in LICENSE NOTICE LICENSE-bin NOTICE-bin; do
+ if ! unzip -p "$whl" "*.dist-info/licenses/${f}" 2>/dev/null | grep . >/dev/null; then
echo "Error: ${f} is missing or empty in ${whl}"
exit 1
fi
done
+ for text in "Tokio Contributors" "Carl Lerche" "Meta Platforms" "1991-2018 Unicode"; do
+ if ! unzip -p "$whl" "*.dist-info/licenses/LICENSE-bin" | grep -F "$text" >/dev/null; then
+ echo "Error: $text attribution is missing in $whl"
+ exit 1
+ fi
+ done
+ if ! unzip -p "$whl" "*.dist-info/licenses/NOTICE-bin" | grep -F "Apache Arrow" >/dev/null; then
+ echo "Error: Arrow NOTICE is missing in $whl"
+ exit 1
+ fi
done
release:
diff --git a/.github/workflows/rust-license-and-format.yml b/.github/workflows/rust-license-and-format.yml
index 1d9940ee2..7a27651ef 100644
--- a/.github/workflows/rust-license-and-format.yml
+++ b/.github/workflows/rust-license-and-format.yml
@@ -35,6 +35,7 @@ on:
- 'fluss-rust/rustfmt.toml'
- 'fluss-rust/rust-toolchain.toml'
- 'fluss-rpc/src/main/proto/**'
+ - 'tools/releasing/*rust_license.py'
- '.github/workflows/rust-license-and-format.yml'
pull_request:
branches:
@@ -53,6 +54,7 @@ on:
- 'fluss-rust/rustfmt.toml'
- 'fluss-rust/rust-toolchain.toml'
- 'fluss-rpc/src/main/proto/**'
+ - 'tools/releasing/*rust_license.py'
- '.github/workflows/rust-license-and-format.yml'
workflow_dispatch:
@@ -89,6 +91,11 @@ jobs:
cargo fetch --locked
python3 scripts/dependencies.py verify
+ - name: Python binary license tests and drift check
+ run: |
+ python3 -m unittest discover -s ../tools/releasing -p 'test_generate_rust_license.py'
+ python3 bindings/python/generate_binary_license.py --check
+
# release.sh archives this subtree and nothing else inspects the result;
# the crate is covered by rust-release.yml before it publishes.
- name: Source release contents
diff --git a/fluss-gateway/scripts/generate_binary_license.py b/fluss-gateway/scripts/generate_binary_license.py
index 512b147a3..44d25df84 100755
--- a/fluss-gateway/scripts/generate_binary_license.py
+++ b/fluss-gateway/scripts/generate_binary_license.py
@@ -20,395 +20,44 @@
"""Generate LICENSE-bin and NOTICE-bin for the shipped Linux Gateway binary."""
import argparse
-import hashlib
-import json
+import sys
from pathlib import Path
-import re
-import subprocess
-from typing import Dict, Iterable, List, Set, Tuple
+REPOSITORY_ROOT = Path(__file__).resolve().parents[2]
+sys.path.insert(0, str(REPOSITORY_ROOT / "tools" / "releasing"))
+import generate_rust_license as generator
-TARGETS = (
- "x86_64-unknown-linux-gnu",
- "aarch64-unknown-linux-gnu",
-)
-LOCAL_PACKAGES = {"fluss-gateway", "fluss-rs"}
-SEPARATOR = "-" * 80
+TARGETS = ("x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu")
-# These licenses cover incorporated code or data, independently of the crate's
-# top-level SPDX choice. Keep the reviewed paths explicit: a renamed or removed
-# file after a dependency update must trigger a fresh review, not silent omission.
-INCORPORATED_LICENSE_FILES = {
- "regex-syntax": ("src/unicode_tables/LICENSE-UNICODE",),
- "zstd-sys": ("LICENSE.BSD-3-Clause", "zstd/LICENSE"),
-}
-
-def cargo_metadata(gateway_dir: Path, target: str) -> dict:
- command = [
- "cargo",
- "metadata",
- "--manifest-path",
- str(gateway_dir / "Cargo.toml"),
- "--locked",
- "--format-version",
- "1",
- "--filter-platform",
- target,
- ]
- return json.loads(subprocess.check_output(command, text=True))
-
-
-def is_proc_macro(package: dict) -> bool:
- return any(
- "proc-macro" in target["kind"] for target in package.get("targets", ())
- )
-
-
-def runtime_packages(gateway_dir: Path) -> List[dict]:
- packages: Dict[str, dict] = {}
- runtime_ids: Set[str] = set()
-
- for target in TARGETS:
- metadata = cargo_metadata(gateway_dir, target)
- target_packages = {
- package["id"]: package for package in metadata["packages"]
- }
- packages.update(target_packages)
- nodes = {node["id"]: node for node in metadata["resolve"]["nodes"]}
- pending = [metadata["resolve"]["root"]]
- target_ids: Set[str] = set()
-
- while pending:
- package_id = pending.pop()
- if package_id in target_ids:
- continue
- target_ids.add(package_id)
- runtime_ids.add(package_id)
- for dependency in nodes[package_id]["deps"]:
- if (
- any(kind["kind"] is None for kind in dependency["dep_kinds"])
- and not is_proc_macro(target_packages[dependency["pkg"]])
- ):
- pending.append(dependency["pkg"])
-
- return sorted(
- (packages[package_id] for package_id in runtime_ids),
- key=lambda package: (package["name"], package["version"]),
- )
-
-
-def license_terms(expression: str) -> Tuple[str, ...]:
- """Select one compatible branch from each AND term in an SPDX expression."""
-
- expression = expression.replace("/", " OR ")
- selected: List[str] = []
- preferences = (
- "Apache-2.0",
- "MIT",
- "BSD-2-Clause",
- "BSD-3-Clause",
- "ISC",
- "Unicode-3.0",
- "Zlib",
- "CC0-1.0",
- "CDLA-Permissive-2.0",
- )
-
- for required_term in re.split(r"\s+AND\s+", expression.strip("()")):
- alternatives = [
- alternative.strip("() ")
- for alternative in re.split(r"\s+OR\s+", required_term)
- ]
- for preferred in preferences:
- if preferred in alternatives:
- selected.append(preferred)
- break
- else:
- raise RuntimeError(
- "No approved binary license selection for expression "
- f"{expression!r}."
- )
-
- return tuple(dict.fromkeys(selected))
-
-
-def license_files(package: dict, selected_terms: Tuple[str, ...]) -> List[Path]:
- package_dir = Path(package["manifest_path"]).parent
- incorporated = []
- for relative_path in INCORPORATED_LICENSE_FILES.get(package["name"], ()):
- path = package_dir / relative_path
- if not path.is_file():
- raise RuntimeError(
- f"Missing incorporated license {relative_path} for "
- f"{package['name']}@{package['version']}; review the updated crate."
- )
- incorporated.append(path)
- return sorted(set(crate_license_files(package, selected_terms) + incorporated))
-
-
-def crate_license_files(package: dict, selected_terms: Tuple[str, ...]) -> List[Path]:
- package_dir = Path(package["manifest_path"]).parent
- candidates = sorted(
- path
- for path in package_dir.rglob("*")
- if path.is_file()
- and re.match(r"(?i)^(license|copying)", path.name)
- and ".cargo-ok" not in path.name
- )
-
- if selected_terms == ("Apache-2.0",):
- return []
-
- tokens_by_license = {
- "Apache-2.0": ("apache", "boringssl"),
- "MIT": ("mit",),
- "BSD-2-Clause": ("bsd",),
- "BSD-3-Clause": ("bsd", "httprouter"),
- "ISC": ("isc", "other-bits"),
- "Unicode-3.0": ("unicode",),
- "Zlib": ("zlib",),
- "CC0-1.0": ("cc0",),
- "CDLA-Permissive-2.0": ("cdla",),
- }
- tokens = tuple(
- token
- for selected in selected_terms
- for token in tokens_by_license[selected]
- )
- matched = [
- path
- for path in candidates
- if any(token in path.name.lower() for token in tokens)
- ]
-
- # A package with a generically named root LICENSE file has already
- # declared which SPDX license it contains in Cargo.toml. Nested license
- # files describe code incorporated from another project and must be
- # retained even when their file name does not contain the SPDX identifier.
- generic_root_names = {"license", "license.txt", "license.md"}
- matched.extend(
- path
- for path in candidates
- if path.parent != package_dir or path.name.lower() in generic_root_names
- )
- matched = sorted(set(matched))
- matched = [
- path
- for path in matched
- if path.parent != package_dir or not is_standalone_apache_license(path)
- ]
-
- if not matched:
- raise RuntimeError(
- f"Cannot locate the {' AND '.join(selected_terms)} text for "
- f"{package['name']}@{package['version']}; candidates: "
- + ", ".join(str(path.relative_to(package_dir)) for path in candidates)
- )
- return matched
-
-
-def is_standalone_apache_license(path: Path) -> bool:
- text = path.read_text(encoding="utf-8")
- first_line = next((line.strip() for line in text.splitlines() if line.strip()), "")
- name = path.name.lower()
- return (
- "Apache License" in first_line
- and "Version 2.0" in text
- and "TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION" in text
- and (
- "apache" in name
- or name in {"license", "license.txt", "license.md"}
- )
- )
-
-
-def apache_license(repository_root: Path) -> str:
- source_license = (repository_root / "LICENSE").read_text(encoding="utf-8")
- lines = source_license.splitlines()
- separator = next(
- (
- index
- for index, line in enumerate(lines)
- if len(line) >= 20 and set(line) == {"-"}
- ),
- None,
- )
- if separator is None:
- raise RuntimeError("Cannot find the third-party section in the root LICENSE.")
- return "\n".join(lines[:separator]).rstrip() + "\n"
-
-
-def gateway_notice(repository_root: Path) -> str:
- source_notice = (repository_root / "NOTICE").read_text(encoding="utf-8")
- asf_line = "The Apache Software Foundation (http://www.apache.org/)."
- asf_end = source_notice.find(asf_line)
- if asf_end < 0:
- raise RuntimeError("Cannot find the ASF attribution in the root NOTICE.")
- return source_notice[: asf_end + len(asf_line)].rstrip() + "\n"
-
-
-def indent(text: str) -> str:
- lines = []
- for line in text.rstrip().splitlines():
- line = line.rstrip()
- lines.append(f"| {line}" if line else "|")
- return "\n".join(lines)
-
-
-def generate_license(repository_root: Path, packages: Iterable[dict]) -> str:
- sections = [
- apache_license(repository_root),
- "",
- SEPARATOR,
- "",
- "This LICENSE covers the supported amd64 and arm64 Linux Gateway",
- "convenience binaries. Their linked dependency sets are almost identical,",
- "but a target-specific crate may appear here even when it is not linked into",
+def generate_license(repository_root, packages):
+ return generator.generate_license(
+ repository_root,
+ packages,
+ "The supported Linux Gateway binaries",
+ "This LICENSE covers the supported amd64 and arm64 Linux Gateway\n"
+ "convenience binaries. Their linked dependency sets are almost identical,\n"
+ "but a target-specific crate may appear here even when it is not linked into\n"
"the other architecture's executable.",
- ]
- apache_dependencies: List[str] = []
- # Crates that ship byte-identical license text share a single reproduction, which
- # removes about a third of this file. The grouping key is the license text itself,
- # so no reproduced text is ever rewritten, reordered or dropped, and every crate
- # keeps its own attribution block.
- reproductions: Dict[Tuple[Tuple[str, str], ...], List[List[str]]] = {}
-
- for package in packages:
- if package["source"] is None and package["name"] in LOCAL_PACKAGES:
- continue
- expression = package.get("license")
- if not expression:
- raise RuntimeError(
- f"{package['name']}@{package['version']} has no SPDX license."
- )
- selected_terms = license_terms(expression)
- package_name = f"{package['name']}@{package['version']}"
- if "Apache-2.0" in selected_terms:
- apache_dependencies.append(package_name)
-
- files = license_files(package, selected_terms)
- if not files:
- continue
-
- package_dir = Path(package["manifest_path"]).parent
- homepage = package.get("homepage") or package.get("repository") or "(not provided)"
- attribution = [
- f"The supported Linux Gateway binaries use the Rust crate {package_name}.",
- f"Project URL: {homepage}",
- f"Declared license: {expression}",
- f"Selected crate license: {' AND '.join(selected_terms)}",
- ]
- reproduction = tuple(
- (
- str(path.relative_to(package_dir)),
- path.read_text(encoding="utf-8").rstrip(),
- )
- for path in files
- )
- reproductions.setdefault(reproduction, []).append(attribution)
-
- other_sections: List[str] = []
- for reproduction, attributions in reproductions.items():
- contents = [SEPARATOR]
- for attribution in attributions:
- contents.append("")
- contents.extend(attribution)
- if len(attributions) > 1:
- contents.extend(
- [
- "",
- "These crates ship identical license text, reproduced once below.",
- ]
- )
- for file_name, text in reproduction:
- contents.extend(["", f"License file: {file_name}", indent(text)])
- other_sections.append("\n".join(contents))
-
- sections.extend(
- [
- "",
- SEPARATOR,
- "",
- "The supported Linux Gateway binaries include the following Rust crates",
- "under the Apache License, Version 2.0. Crates with additional conjunctive",
- "license obligations or incorporated components with separate licenses",
- "are also reproduced in the sections below.",
- "",
- "\n".join(apache_dependencies),
- ]
)
- sections.extend(other_sections)
- return "\n".join(sections).rstrip() + "\n"
-
-
-def generate_notice(repository_root: Path, packages: Iterable[dict]) -> str:
- unique_notices: Dict[str, Tuple[str, List[str]]] = {}
-
- for package in packages:
- if package["source"] is None and package["name"] in LOCAL_PACKAGES:
- continue
- package_dir = Path(package["manifest_path"]).parent
- for path in sorted(package_dir.glob("NOTICE*")):
- if not path.is_file():
- continue
- text = path.read_text(encoding="utf-8").rstrip()
- digest = hashlib.sha256(text.encode("utf-8")).hexdigest()
- if digest not in unique_notices:
- unique_notices[digest] = (text, [])
- unique_notices[digest][1].append(
- f"{package['name']}@{package['version']}"
- )
- sections = [gateway_notice(repository_root)]
- for text, package_names in sorted(
- unique_notices.values(), key=lambda item: item[1]
- ):
- sections.extend(
- [
- "",
- SEPARATOR,
- "",
- "The following notice applies to: "
- + ", ".join(sorted(package_names)),
- "",
- text,
- ]
- )
- return "\n".join(sections).rstrip() + "\n"
-
-def main() -> None:
- parser = argparse.ArgumentParser()
- parser.add_argument(
- "--check",
- action="store_true",
- help="fail instead of updating files when generated content differs",
- )
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--check", action="store_true", help="fail on stale files")
args = parser.parse_args()
-
- gateway_dir = Path(__file__).resolve().parent.parent
- repository_root = gateway_dir.parent
- packages = runtime_packages(gateway_dir)
- generated = {
- gateway_dir / "LICENSE-bin": generate_license(repository_root, packages),
- gateway_dir / "NOTICE-bin": generate_notice(repository_root, packages),
- }
-
- changed = []
- for path, contents in generated.items():
- current = path.read_text(encoding="utf-8") if path.exists() else None
- if current == contents:
- continue
- changed.append(path)
- if not args.check:
- path.write_text(contents, encoding="utf-8")
-
- if args.check and changed:
- raise SystemExit(
- "Gateway binary license files are stale: "
- + ", ".join(str(path.relative_to(repository_root)) for path in changed)
- )
+ gateway_dir = REPOSITORY_ROOT / "fluss-gateway"
+ packages = generator.runtime_packages(gateway_dir, TARGETS, "fluss-gateway")
+ generator.write_generated_files(
+ REPOSITORY_ROOT,
+ {
+ gateway_dir / "LICENSE-bin": generate_license(REPOSITORY_ROOT, packages),
+ gateway_dir / "NOTICE-bin": generator.generate_notice(
+ REPOSITORY_ROOT, packages
+ ),
+ },
+ args.check,
+ )
if __name__ == "__main__":
diff --git a/fluss-rust/.licenserc.yaml b/fluss-rust/.licenserc.yaml
index b61b4a3bb..db33845f3 100644
--- a/fluss-rust/.licenserc.yaml
+++ b/fluss-rust/.licenserc.yaml
@@ -28,7 +28,9 @@ header:
- '.gitignore'
- 'Cargo.lock'
- 'LICENSE'
+ - 'LICENSE-bin'
- 'NOTICE'
+ - 'NOTICE-bin'
- 'DISCLAIMER'
- 'fluss-rust/bindings/python/fluss/py.typed'
- 'fluss-rust/**/mix.lock'
diff --git a/fluss-rust/bindings/python/DEVELOPMENT.md b/fluss-rust/bindings/python/DEVELOPMENT.md
index 40e473c9d..8a916ce4e 100644
--- a/fluss-rust/bindings/python/DEVELOPMENT.md
+++ b/fluss-rust/bindings/python/DEVELOPMENT.md
@@ -133,3 +133,22 @@ bindings/python/
## License
Apache 2.0 License
+
+## Binary license files
+
+The wheel statically links Rust dependencies, so `LICENSE-bin` and `NOTICE-bin`
+are generated separately from the source `LICENSE` and `NOTICE`. From the
+repository checkout, regenerate the union of supported release targets with:
+
+```bash
+python3 generate_binary_license.py
+python3 generate_binary_license.py --check
+```
+
+After updating `Cargo.lock`, review these generated files, including licenses of
+native code and data incorporated into crates. The generator excludes build,
+development and procedural-macro dependencies and uses the shared Rust license
+collector in `tools/releasing/generate_rust_license.py`. For a wheel for one
+platform, use `--target <Rust target triple>` before `maturin build --locked`;
+the release workflow does this for each platform and verifies the wheel contents.
+All four legal files are included in both wheels and the source distribution.
diff --git a/fluss-rust/bindings/python/LICENSE-bin b/fluss-rust/bindings/python/LICENSE-bin
new file mode 100644
index 000000000..6fca83bbe
--- /dev/null
+++ b/fluss-rust/bindings/python/LICENSE-bin
@@ -0,0 +1,2774 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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 LICENSE covers Rust dependencies statically linked into the Python
+extension for: x86_64-pc-windows-msvc, x86_64-apple-darwin, aarch64-apple-darwin, x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu.
+When multiple targets are listed, target-specific crates may only be linked
+into the corresponding wheels. Dynamically installed Python dependencies
+such as pandas and pyarrow carry their own licenses.
+
+--------------------------------------------------------------------------------
+
+The Python wheels include the following Rust crates
+under the Apache License, Version 2.0. Crates with additional conjunctive
+license obligations or incorporated components with separate licenses
+are also reproduced in the sections below.
+
+ahash@0.8.12
+anstream@1.0.0
+anstyle@1.0.14
+anstyle-parse@1.0.0
+anstyle-query@1.1.5
+anstyle-wincon@3.0.11
+anyhow@1.0.102
+arrow@59.0.0
+arrow-arith@59.0.0
+arrow-array@59.0.0
+arrow-buffer@59.0.0
+arrow-cast@59.0.0
+arrow-csv@59.0.0
+arrow-data@59.0.0
+arrow-ipc@59.0.0
+arrow-json@59.0.0
+arrow-ord@59.0.0
+arrow-pyarrow@59.0.0
+arrow-row@59.0.0
+arrow-schema@59.0.0
+arrow-select@59.0.0
+arrow-string@59.0.0
+atomic-waker@1.1.2
+backon@1.6.0
+base64@0.22.1
+bigdecimal@0.4.10
+bitflags@2.11.0
+block-buffer@0.10.4
+cfg-if@1.0.4
+chrono@0.4.44
+clap@4.6.0
+clap_builder@4.6.0
+clap_lex@1.1.0
+colorchoice@1.0.5
+const-oid@0.9.6
+const-random@0.1.18
+core-foundation-sys@0.8.7
+cpufeatures@0.2.17
+crc32c@0.6.8
+crossbeam-utils@0.8.21
+crypto-common@0.1.7
+digest@0.10.7
+dlv-list@0.5.2
+equivalent@1.0.2
+erased-serde@0.4.10
+errno@0.3.14
+fastrand@2.4.0
+flatbuffers@25.12.19
+fnv@1.0.7
+form_urlencoded@1.2.2
+futures@0.3.32
+futures-channel@0.3.32
+futures-core@0.3.32
+futures-executor@0.3.32
+futures-io@0.3.32
+futures-sink@0.3.32
+futures-task@0.3.32
+futures-util@0.3.32
+getrandom@0.2.17
+getrandom@0.3.4
+getrandom@0.4.2
+half@2.7.1
+hashbrown@0.14.5
+hashbrown@0.16.1
+hashbrown@0.17.1
+hex@0.4.3
+hmac@0.12.1
+home@0.5.12
+http@1.4.0
+httparse@1.10.1
+httpdate@1.0.3
+hyper-rustls@0.27.7
+iana-time-zone@0.1.65
+idna@1.1.0
+idna_adapter@1.2.1
+indexmap@2.13.1
+ipnet@2.12.0
+iri-string@0.7.12
+is_terminal_polyfill@1.70.2
+itoa@1.0.18
+lexical-core@1.0.6
+lexical-parse-float@1.0.6
+lexical-parse-integer@1.0.6
+lexical-util@1.0.7
+lexical-write-float@1.0.6
+lexical-write-integer@1.0.6
+libc@0.2.184
+linked-hash-map@0.5.6
+linux-raw-sys@0.12.1
+lock_api@0.4.14
+log@0.4.29
+lru-slab@0.1.2
+md-5@0.10.6
+num-bigint@0.4.6
+num-complex@0.4.6
+num-integer@0.1.46
+num-traits@0.2.19
+once_cell@1.21.4
+once_cell_polyfill@1.70.2
+opendal@0.55.0
+parking_lot@0.12.5
+parking_lot_core@0.9.12
+parse-display@0.10.0
+percent-encoding@2.3.2
+pin-project-lite@0.2.17
+ppv-lite86@0.2.21
+prost@0.14.3
+pyo3@0.28.3
+pyo3-async-runtimes@0.28.0
+pyo3-ffi@0.28.3
+quinn@0.11.9
+quinn-proto@0.11.14
+quinn-udp@0.5.14
+rand@0.8.5
+rand@0.9.3
+rand_chacha@0.3.1
+rand_chacha@0.9.0
+rand_core@0.6.4
+rand_core@0.9.5
+rapidhash@4.4.1
+regex@1.12.3
+regex-automata@0.4.14
+regex-syntax@0.8.10
+reqsign@0.16.5
+reqwest@0.12.28
+ring@0.17.14
+rustc-hash@2.1.2
+rustix@1.1.4
+rustls@0.23.37
+rustls-pki-types@1.14.0
+ryu@1.0.23
+scopeguard@1.2.0
+serde@1.0.228
+serde_core@1.0.228
+serde_fmt@1.1.0
+serde_json@1.0.149
+serde_urlencoded@0.7.1
+sha1@0.10.6
+sha2@0.10.9
+signal-hook-registry@1.4.8
+simdutf8@0.1.5
+smallvec@1.15.1
+snafu@0.8.9
+socket2@0.6.3
+stable_deref_trait@1.2.1
+sval@2.18.0
+sval_buffer@2.18.0
+sval_dynamic@2.18.0
+sval_fmt@2.18.0
+sval_json@2.18.0
+sval_nested@2.18.0
+sval_ref@2.18.0
+sval_serde@2.18.0
+sync_wrapper@1.0.2
+tempfile@3.27.0
+thiserror@1.0.69
+thiserror@2.0.18
+tinyvec@1.11.0
+tinyvec_macros@0.1.1
+tokio-rustls@0.26.4
+typeid@1.0.3
+typenum@1.19.0
+url@2.5.8
+utf8_iter@1.0.4
+utf8parse@0.2.2
+uuid@1.23.0
+value-bag@1.12.0
+value-bag-serde1@1.12.0
+value-bag-sval2@1.12.0
+windows-link@0.2.1
+windows-sys@0.60.2
+windows-sys@0.61.2
+windows-targets@0.53.5
+windows_x86_64_msvc@0.53.1
+zerocopy@0.8.48
+zeroize@1.8.2
+zstd-safe@7.2.4
+zstd-sys@2.0.16+zstd.1.5.7
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate aho-corasick@1.1.4.
+Project URL: https://github.com/BurntSushi/aho-corasick
+Declared license: Unlicense OR MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate byteorder@1.5.0.
+Project URL: https://github.com/BurntSushi/byteorder
+Declared license: Unlicense OR MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate csv@1.4.0.
+Project URL: https://github.com/BurntSushi/rust-csv
+Declared license: Unlicense/MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate csv-core@0.1.13.
+Project URL: https://github.com/BurntSushi/rust-csv
+Declared license: Unlicense/MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate jiff@0.2.23.
+Project URL: https://github.com/BurntSushi/jiff
+Declared license: Unlicense OR MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate jiff-tzdb@0.1.6.
+Project URL: https://github.com/BurntSushi/jiff/tree/master/crates/jiff-tzdb
+Declared license: Unlicense OR MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate jiff-tzdb-platform@0.1.3.
+Project URL: https://github.com/BurntSushi/jiff/tree/master/crates/jiff-tzdb-platform
+Declared license: Unlicense OR MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate memchr@2.8.0.
+Project URL: https://github.com/BurntSushi/memchr
+Declared license: Unlicense OR MIT
+Selected crate license: MIT
+
+These crates ship identical license text, reproduced once below.
+
+License file: LICENSE-MIT
+| The MIT License (MIT)
+|
+| Copyright (c) 2015 Andrew Gallant
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in
+| all copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+| THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate arrow-array@59.0.0.
+Project URL: https://github.com/apache/arrow-rs
+Declared license: Apache-2.0 AND MIT
+Selected crate license: Apache-2.0 AND MIT
+
+License file: LICENSE-MIT
+| MIT License
+|
+| Copyright (c) 2020-2022 Oliver Margetts
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate atoi@2.0.0.
+Project URL: https://github.com/pacman82/atoi-rs
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| MIT License
+|
+| Copyright (c) 2017
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate bitvec@1.0.1.
+Project URL: https://bitvecto-rs.github.io/bitvec
+Declared license: MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate wyz@0.5.1.
+Project URL: https://myrrlyn.net/crates/wyz
+Declared license: MIT
+Selected crate license: MIT
+
+These crates ship identical license text, reproduced once below.
+
+License file: LICENSE.txt
+| MIT License
+|
+| Copyright (c) 2018 myrrlyn (Alexander Payne)
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate bytes@1.11.1.
+Project URL: https://github.com/tokio-rs/bytes
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2018 Carl Lerche
+|
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate dashmap@6.1.0.
+Project URL: https://github.com/xacrimon/dashmap
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| MIT License
+|
+| Copyright (c) 2019 Acrimon
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate foldhash@0.2.0.
+Project URL: https://github.com/orlp/foldhash
+Declared license: Zlib
+Selected crate license: Zlib
+
+License file: LICENSE
+| Copyright (c) 2024 Orson Peters
+|
+| This software is provided 'as-is', without any express or implied warranty. In
+| no event will the authors be held liable for any damages arising from the use of
+| this software.
+|
+| Permission is granted to anyone to use this software for any purpose, including
+| commercial applications, and to alter it and redistribute it freely, subject to
+| the following restrictions:
+|
+| 1. The origin of this software must not be misrepresented; you must not claim
+| that you wrote the original software. If you use this software in a product,
+| an acknowledgment in the product documentation would be appreciated but is
+| not required.
+|
+| 2. Altered source versions must be plainly marked as such, and must not be
+| misrepresented as being the original software.
+|
+| 3. This notice may not be removed or altered from any source distribution.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate funty@2.0.0.
+Project URL: https://github.com/myrrlyn/funty
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE.txt
+| MIT License
+|
+| Copyright (c) 2020 myrrlyn (Alexander Payne)
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate generic-array@0.14.7.
+Project URL: https://github.com/fizyk20/generic-array.git
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| The MIT License (MIT)
+|
+| Copyright (c) 2015 Bartłomiej Kamiński
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate h2@0.4.13.
+Project URL: https://github.com/hyperium/h2
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2017 h2 authors
+|
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate http-body@1.0.1.
+Project URL: https://github.com/hyperium/http-body
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2019-2024 Sean McArthur & Hyper Contributors
+|
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate http-body-util@0.1.3.
+Project URL: https://github.com/hyperium/http-body
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2019-2025 Sean McArthur & Hyper Contributors
+|
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate hyper@1.9.0.
+Project URL: https://hyper.rs
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2014-2026 Sean McArthur
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in
+| all copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+| THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate hyper-util@0.1.20.
+Project URL: https://hyper.rs
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2023-2025 Sean McArthur
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in
+| all copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+| THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate icu_collections@2.2.0.
+Project URL: https://icu4x.unicode.org
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate icu_locale_core@2.2.0.
+Project URL: https://icu4x.unicode.org
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate icu_normalizer@2.2.0.
+Project URL: https://icu4x.unicode.org
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate icu_normalizer_data@2.2.0.
+Project URL: https://icu4x.unicode.org
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate icu_properties@2.2.0.
+Project URL: https://icu4x.unicode.org
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate icu_properties_data@2.2.0.
+Project URL: https://icu4x.unicode.org
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate icu_provider@2.2.0.
+Project URL: https://icu4x.unicode.org
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate litemap@0.8.2.
+Project URL: https://github.com/unicode-org/icu4x
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate potential_utf@0.1.5.
+Project URL: https://icu4x.unicode.org
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate tinystr@0.8.3.
+Project URL: https://github.com/unicode-org/icu4x
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate writeable@0.6.3.
+Project URL: https://github.com/unicode-org/icu4x
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate yoke@0.8.2.
+Project URL: https://github.com/unicode-org/icu4x
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate zerofrom@0.1.7.
+Project URL: https://github.com/unicode-org/icu4x
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate zerotrie@0.2.4.
+Project URL: https://icu4x.unicode.org
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+The Python wheels use the Rust crate zerovec@0.11.6.
+Project URL: https://github.com/unicode-org/icu4x
+Declared license: Unicode-3.0
+Selected crate license: Unicode-3.0
+
+These crates ship identical license text, reproduced once below.
+
+License file: LICENSE
+| UNICODE LICENSE V3
+|
+| COPYRIGHT AND PERMISSION NOTICE
+|
+| Copyright © 2020-2024 Unicode, Inc.
+|
+| NOTICE TO USER: Carefully read the following legal agreement. BY
+| DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
+| SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
+| TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
+| DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
+|
+| Permission is hereby granted, free of charge, to any person obtaining a
+| copy of data files and any associated documentation (the "Data Files") or
+| software and any associated documentation (the "Software") to deal in the
+| Data Files or Software without restriction, including without limitation
+| the rights to use, copy, modify, merge, publish, distribute, and/or sell
+| copies of the Data Files or Software, and to permit persons to whom the
+| Data Files or Software are furnished to do so, provided that either (a)
+| this copyright and permission notice appear with all copies of the Data
+| Files or Software, or (b) this copyright and permission notice appear in
+| associated Documentation.
+|
+| THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+| KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+| THIRD PARTY RIGHTS.
+|
+| IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
+| BE LIABLE FOR ANY CLAIM, OR 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 TORTIOUS ACTION,
+| ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA
+| FILES OR SOFTWARE.
+|
+| Except as contained in this notice, the name of a copyright holder shall
+| not be used in advertising or otherwise to promote the sale, use or other
+| dealings in these Data Files or Software without prior written
+| authorization of the copyright holder.
+|
+| SPDX-License-Identifier: Unicode-3.0
+|
+| —
+|
+| Portions of ICU4X may have been adapted from ICU4C and/or ICU4J.
+| ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate libm@0.2.16.
+Project URL: https://github.com/rust-lang/compiler-builtins
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE.txt
+| rust-lang/libm as a whole is available for use under the MIT license:
+|
+| ------------------------------------------------------------------------------
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+| ------------------------------------------------------------------------------
+|
+| As a contributor, you agree that your code can be used under either the MIT
+| license or the Apache-2.0 license:
+|
+| ------------------------------------------------------------------------------
+| Apache License
+| Version 2.0, January 2004
+| http://www.apache.org/licenses/
+|
+| TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+|
+| 1. Definitions.
+|
+| "License" shall mean the terms and conditions for use, reproduction,
+| and distribution as defined by Sections 1 through 9 of this document.
+|
+| "Licensor" shall mean the copyright owner or entity authorized by
+| the copyright owner that is granting the License.
+|
+| "Legal Entity" shall mean the union of the acting entity and all
+| other entities that control, are controlled by, or are under common
+| control with that entity. For the purposes of this definition,
+| "control" means (i) the power, direct or indirect, to cause the
+| direction or management of such entity, whether by contract or
+| otherwise, or (ii) ownership of fifty percent (50%) or more of the
+| outstanding shares, or (iii) beneficial ownership of such entity.
+|
+| "You" (or "Your") shall mean an individual or Legal Entity
+| exercising permissions granted by this License.
+|
+| "Source" form shall mean the preferred form for making modifications,
+| including but not limited to software source code, documentation
+| source, and configuration files.
+|
+| "Object" form shall mean any form resulting from mechanical
+| transformation or translation of a Source form, including but
+| not limited to compiled object code, generated documentation,
+| and conversions to other media types.
+|
+| "Work" shall mean the work of authorship, whether in Source or
+| Object form, made available under the License, as indicated by a
+| copyright notice that is included in or attached to the work
+| (an example is provided in the Appendix below).
+|
+| "Derivative Works" shall mean any work, whether in Source or Object
+| form, that is based on (or derived from) the Work and for which the
+| editorial revisions, annotations, elaborations, or other modifications
+| represent, as a whole, an original work of authorship. For the purposes
+| of this License, Derivative Works shall not include works that remain
+| separable from, or merely link (or bind by name) to the interfaces of,
+| the Work and Derivative Works thereof.
+|
+| "Contribution" shall mean any work of authorship, including
+| the original version of the Work and any modifications or additions
+| to that Work or Derivative Works thereof, that is intentionally
+| submitted to Licensor for inclusion in the Work by the copyright owner
+| or by an individual or Legal Entity authorized to submit on behalf of
+| the copyright owner. For the purposes of this definition, "submitted"
+| means any form of electronic, verbal, or written communication sent
+| to the Licensor or its representatives, including but not limited to
+| communication on electronic mailing lists, source code control systems,
+| and issue tracking systems that are managed by, or on behalf of, the
+| Licensor for the purpose of discussing and improving the Work, but
+| excluding communication that is conspicuously marked or otherwise
+| designated in writing by the copyright owner as "Not a Contribution."
+|
+| "Contributor" shall mean Licensor and any individual or Legal Entity
+| on behalf of whom a Contribution has been received by Licensor and
+| subsequently incorporated within the Work.
+|
+| 2. Grant of Copyright License. Subject to the terms and conditions of
+| this License, each Contributor hereby grants to You a perpetual,
+| worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+| copyright license to reproduce, prepare Derivative Works of,
+| publicly display, publicly perform, sublicense, and distribute the
+| Work and such Derivative Works in Source or Object form.
+|
+| 3. Grant of Patent License. Subject to the terms and conditions of
+| this License, each Contributor hereby grants to You a perpetual,
+| worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+| (except as stated in this section) patent license to make, have made,
+| use, offer to sell, sell, import, and otherwise transfer the Work,
+| where such license applies only to those patent claims licensable
+| by such Contributor that are necessarily infringed by their
+| Contribution(s) alone or by combination of their Contribution(s)
+| with the Work to which such Contribution(s) was submitted. If You
+| institute patent litigation against any entity (including a
+| cross-claim or counterclaim in a lawsuit) alleging that the Work
+| or a Contribution incorporated within the Work constitutes direct
+| or contributory patent infringement, then any patent licenses
+| granted to You under this License for that Work shall terminate
+| as of the date such litigation is filed.
+|
+| 4. Redistribution. You may reproduce and distribute copies of the
+| Work or Derivative Works thereof in any medium, with or without
+| modifications, and in Source or Object form, provided that You
+| meet the following conditions:
+|
+| (a) You must give any other recipients of the Work or
+| Derivative Works a copy of this License; and
+|
+| (b) You must cause any modified files to carry prominent notices
+| stating that You changed the files; and
+|
+| (c) You must retain, in the Source form of any Derivative Works
+| that You distribute, all copyright, patent, trademark, and
+| attribution notices from the Source form of the Work,
+| excluding those notices that do not pertain to any part of
+| the Derivative Works; and
+|
+| (d) If the Work includes a "NOTICE" text file as part of its
+| distribution, then any Derivative Works that You distribute must
+| include a readable copy of the attribution notices contained
+| within such NOTICE file, excluding those notices that do not
+| pertain to any part of the Derivative Works, in at least one
+| of the following places: within a NOTICE text file distributed
+| as part of the Derivative Works; within the Source form or
+| documentation, if provided along with the Derivative Works; or,
+| within a display generated by the Derivative Works, if and
+| wherever such third-party notices normally appear. The contents
+| of the NOTICE file are for informational purposes only and
+| do not modify the License. You may add Your own attribution
+| notices within Derivative Works that You distribute, alongside
+| or as an addendum to the NOTICE text from the Work, provided
+| that such additional attribution notices cannot be construed
+| as modifying the License.
+|
+| You may add Your own copyright statement to Your modifications and
+| may provide additional or different license terms and conditions
+| for use, reproduction, or distribution of Your modifications, or
+| for any such Derivative Works as a whole, provided Your use,
+| reproduction, and distribution of the Work otherwise complies with
+| the conditions stated in this License.
+|
+| 5. Submission of Contributions. Unless You explicitly state otherwise,
+| any Contribution intentionally submitted for inclusion in the Work
+| by You to the Licensor shall be under the terms and conditions of
+| this License, without any additional terms or conditions.
+| Notwithstanding the above, nothing herein shall supersede or modify
+| the terms of any separate license agreement you may have executed
+| with Licensor regarding such Contributions.
+|
+| 6. Trademarks. This License does not grant permission to use the trade
+| names, trademarks, service marks, or product names of the Licensor,
+| except as required for reasonable and customary use in describing the
+| origin of the Work and reproducing the content of the NOTICE file.
+|
+| 7. Disclaimer of Warranty. Unless required by applicable law or
+| agreed to in writing, Licensor provides the Work (and each
+| Contributor provides its Contributions) on an "AS IS" BASIS,
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+| implied, including, without limitation, any warranties or conditions
+| of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+| PARTICULAR PURPOSE. You are solely responsible for determining the
+| appropriateness of using or redistributing the Work and assume any
+| risks associated with Your exercise of permissions under this License.
+|
+| 8. Limitation of Liability. In no event and under no legal theory,
+| whether in tort (including negligence), contract, or otherwise,
+| unless required by applicable law (such as deliberate and grossly
+| negligent acts) or agreed to in writing, shall any Contributor be
+| liable to You for damages, including any direct, indirect, special,
+| incidental, or consequential damages of any character arising as a
+| result of this License or out of the use or inability to use the
+| Work (including but not limited to damages for loss of goodwill,
+| work stoppage, computer failure or malfunction, or any and all
+| other commercial damages or losses), even if such Contributor
+| has been advised of the possibility of such damages.
+|
+| 9. Accepting Warranty or Additional Liability. While redistributing
+| the Work or Derivative Works thereof, You may choose to offer,
+| and charge a fee for, acceptance of support, warranty, indemnity,
+| or other liability obligations and/or rights consistent with this
+| License. However, in accepting such obligations, You may act only
+| on Your own behalf and on Your sole responsibility, not on behalf
+| of any other Contributor, and only if You agree to indemnify,
+| defend, and hold each Contributor harmless for any liability
+| incurred by, or claims asserted against, such Contributor by reason
+| of your accepting any such warranty or additional liability.
+|
+| END OF TERMS AND CONDITIONS
+|
+| APPENDIX: How to apply the Apache License to your work.
+|
+| To apply the Apache License to your work, attach the following
+| boilerplate notice, with the fields enclosed by brackets "[]"
+| replaced with your own identifying information. (Don't include
+| the brackets!) The text should be enclosed in the appropriate
+| comment syntax for the file format. We also recommend that a
+| file or class name and description of purpose be included on the
+| same "printed page" as the copyright notice for easier
+| identification within third-party archives.
+|
+| 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 Rust library contains the following copyrights:
+|
+| Copyright (c) 2018 Jorge Aparicio
+|
+| Portions of this software are derived from third-party works licensed under
+| terms compatible with the above MIT license:
+|
+| * musl libc https://www.musl-libc.org/. This library contains the following
+| copyright:
+|
+| Copyright © 2005-2020 Rich Felker, et al.
+|
+| * The CORE-MATH project https://core-math.gitlabpages.inria.fr/. CORE-MATH
+| routines are available under the MIT license on a per-file basis.
+|
+| The musl libc COPYRIGHT file also includes the following notice relevant to
+| math portions of the library:
+|
+| ------------------------------------------------------------------------------
+| Much of the math library code (src/math/* and src/complex/*) is
+| Copyright © 1993,2004 Sun Microsystems or
+| Copyright © 2003-2011 David Schultz or
+| Copyright © 2003-2009 Steven G. Kargl or
+| Copyright © 2003-2009 Bruce D. Evans or
+| Copyright © 2008 Stephen L. Moshier or
+| Copyright © 2017-2018 Arm Limited
+| and labelled as such in comments in the individual source files. All
+| have been licensed under extremely permissive terms.
+| ------------------------------------------------------------------------------
+|
+| Copyright notices are retained in src/* files where relevant.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate lz4_flex@0.13.1.
+Project URL: https://github.com/pseitz/lz4_flex
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| The MIT License (MIT)
+|
+| Copyright (c) 2020 Pascal Seitz
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy of
+| this software and associated documentation files (the "Software"), to deal in
+| the Software without restriction, including without limitation the rights to
+| use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software is furnished to do so,
+| subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+| FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+| COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+| IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate metrics@0.24.5.
+Project URL: https://github.com/metrics-rs/metrics
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2021 Metrics Contributors
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate mio@1.2.0.
+Project URL: https://github.com/tokio-rs/mio
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2014 Carl Lerche and other MIO contributors
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in
+| all copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+| THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate ordered-float@5.3.0.
+Project URL: https://github.com/reem/rust-ordered-float
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE-MIT
+| Copyright (c) 2015 Jonathan Reem
+|
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate ordered-multimap@0.7.3.
+Project URL: https://github.com/sgodwincs/ordered-multimap-rs
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| MIT License
+|
+| Copyright (c) 2018 sgodwincs
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate quick-xml@0.37.5.
+Project URL: https://github.com/tafia/quick-xml
+Declared license: MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate quick-xml@0.38.4.
+Project URL: https://github.com/tafia/quick-xml
+Declared license: MIT
+Selected crate license: MIT
+
+These crates ship identical license text, reproduced once below.
+
+License file: LICENSE-MIT.md
+| The MIT License (MIT)
+|
+| Copyright (c) 2016 Johann Tuffe
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+|
+| The above copyright notice and this permission notice shall be included in
+| all copies or substantial portions of the Software.
+|
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+| THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate radium@0.7.0.
+Project URL: https://github.com/bitvecto-rs/radium
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE.txt
+| MIT License
+|
+| Copyright (c) 2019 kneecaw (Nika Layzell)
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate regex-syntax@0.8.10.
+Project URL: https://github.com/rust-lang/regex/tree/master/regex-syntax
+Declared license: MIT OR Apache-2.0
+Selected crate license: Apache-2.0
+
+License file: src/unicode_tables/LICENSE-UNICODE
+| UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+|
+| Unicode Data Files include all data files under the directories
+| http://www.unicode.org/Public/, http://www.unicode.org/reports/,
+| http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and
+| http://www.unicode.org/utility/trac/browser/.
+|
+| Unicode Data Files do not include PDF online code charts under the
+| directory http://www.unicode.org/Public/.
+|
+| Software includes any source code published in the Unicode Standard
+| or under the directories
+| http://www.unicode.org/Public/, http://www.unicode.org/reports/,
+| http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and
+| http://www.unicode.org/utility/trac/browser/.
+|
+| NOTICE TO USER: Carefully read the following legal agreement.
+| BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S
+| DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"),
+| YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
+| TERMS AND CONDITIONS OF THIS AGREEMENT.
+| IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE
+| THE DATA FILES OR SOFTWARE.
+|
+| COPYRIGHT AND PERMISSION NOTICE
+|
+| Copyright © 1991-2018 Unicode, Inc. All rights reserved.
+| Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
+|
+| Permission is hereby granted, free of charge, to any person obtaining
+| a copy of the Unicode data files and any associated documentation
+| (the "Data Files") or Unicode software and any associated documentation
+| (the "Software") to deal in the Data Files or Software
+| without restriction, including without limitation the rights to use,
+| copy, modify, merge, publish, distribute, and/or sell copies of
+| the Data Files or Software, and to permit persons to whom the Data Files
+| or Software are furnished to do so, provided that either
+| (a) this copyright and permission notice appear with all copies
+| of the Data Files or Software, or
+| (b) this copyright and permission notice appear in associated
+| Documentation.
+|
+| THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+| WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+| NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+| IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+| NOTICE BE LIABLE FOR ANY CLAIM, OR 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
+| TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+| PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+|
+| Except as contained in this notice, the name of a copyright holder
+| shall not be used in advertising or otherwise to promote the sale,
+| use or other dealings in these Data Files or Software without prior
+| written authorization of the copyright holder.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate ring@0.17.14.
+Project URL: https://github.com/briansmith/ring
+Declared license: Apache-2.0 AND ISC
+Selected crate license: Apache-2.0 AND ISC
+
+License file: LICENSE
+| *ring* uses an "ISC" license, like BoringSSL used to use, for new code
+| files. See LICENSE-other-bits for the text of that license.
+|
+| See LICENSE-BoringSSL for code that was sourced from BoringSSL under the
+| Apache 2.0 license. Some code that was sourced from BoringSSL under the ISC
+| license. In each case, the license info is at the top of the file.
+|
+| See src/polyfill/once_cell/LICENSE-APACHE and src/polyfill/once_cell/LICENSE-MIT
+| for the license to code that was sourced from the once_cell project.
+
+License file: LICENSE-BoringSSL
+|
+| Apache License
+| Version 2.0, January 2004
+| http://www.apache.org/licenses/
+|
+| TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+|
+| 1. Definitions.
+|
+| "License" shall mean the terms and conditions for use, reproduction,
+| and distribution as defined by Sections 1 through 9 of this document.
+|
+| "Licensor" shall mean the copyright owner or entity authorized by
+| the copyright owner that is granting the License.
+|
+| "Legal Entity" shall mean the union of the acting entity and all
+| other entities that control, are controlled by, or are under common
+| control with that entity. For the purposes of this definition,
+| "control" means (i) the power, direct or indirect, to cause the
+| direction or management of such entity, whether by contract or
+| otherwise, or (ii) ownership of fifty percent (50%) or more of the
+| outstanding shares, or (iii) beneficial ownership of such entity.
+|
+| "You" (or "Your") shall mean an individual or Legal Entity
+| exercising permissions granted by this License.
+|
+| "Source" form shall mean the preferred form for making modifications,
+| including but not limited to software source code, documentation
+| source, and configuration files.
+|
+| "Object" form shall mean any form resulting from mechanical
+| transformation or translation of a Source form, including but
+| not limited to compiled object code, generated documentation,
+| and conversions to other media types.
+|
+| "Work" shall mean the work of authorship, whether in Source or
+| Object form, made available under the License, as indicated by a
+| copyright notice that is included in or attached to the work
+| (an example is provided in the Appendix below).
+|
+| "Derivative Works" shall mean any work, whether in Source or Object
+| form, that is based on (or derived from) the Work and for which the
+| editorial revisions, annotations, elaborations, or other modifications
+| represent, as a whole, an original work of authorship. For the purposes
+| of this License, Derivative Works shall not include works that remain
+| separable from, or merely link (or bind by name) to the interfaces of,
+| the Work and Derivative Works thereof.
+|
+| "Contribution" shall mean any work of authorship, including
+| the original version of the Work and any modifications or additions
+| to that Work or Derivative Works thereof, that is intentionally
+| submitted to Licensor for inclusion in the Work by the copyright owner
+| or by an individual or Legal Entity authorized to submit on behalf of
+| the copyright owner. For the purposes of this definition, "submitted"
+| means any form of electronic, verbal, or written communication sent
+| to the Licensor or its representatives, including but not limited to
+| communication on electronic mailing lists, source code control systems,
+| and issue tracking systems that are managed by, or on behalf of, the
+| Licensor for the purpose of discussing and improving the Work, but
+| excluding communication that is conspicuously marked or otherwise
+| designated in writing by the copyright owner as "Not a Contribution."
+|
+| "Contributor" shall mean Licensor and any individual or Legal Entity
+| on behalf of whom a Contribution has been received by Licensor and
+| subsequently incorporated within the Work.
+|
+| 2. Grant of Copyright License. Subject to the terms and conditions of
+| this License, each Contributor hereby grants to You a perpetual,
+| worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+| copyright license to reproduce, prepare Derivative Works of,
+| publicly display, publicly perform, sublicense, and distribute the
+| Work and such Derivative Works in Source or Object form.
+|
+| 3. Grant of Patent License. Subject to the terms and conditions of
+| this License, each Contributor hereby grants to You a perpetual,
+| worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+| (except as stated in this section) patent license to make, have made,
+| use, offer to sell, sell, import, and otherwise transfer the Work,
+| where such license applies only to those patent claims licensable
+| by such Contributor that are necessarily infringed by their
+| Contribution(s) alone or by combination of their Contribution(s)
+| with the Work to which such Contribution(s) was submitted. If You
+| institute patent litigation against any entity (including a
+| cross-claim or counterclaim in a lawsuit) alleging that the Work
+| or a Contribution incorporated within the Work constitutes direct
+| or contributory patent infringement, then any patent licenses
+| granted to You under this License for that Work shall terminate
+| as of the date such litigation is filed.
+|
+| 4. Redistribution. You may reproduce and distribute copies of the
+| Work or Derivative Works thereof in any medium, with or without
+| modifications, and in Source or Object form, provided that You
+| meet the following conditions:
+|
+| (a) You must give any other recipients of the Work or
+| Derivative Works a copy of this License; and
+|
+| (b) You must cause any modified files to carry prominent notices
+| stating that You changed the files; and
+|
+| (c) You must retain, in the Source form of any Derivative Works
+| that You distribute, all copyright, patent, trademark, and
+| attribution notices from the Source form of the Work,
+| excluding those notices that do not pertain to any part of
+| the Derivative Works; and
+|
+| (d) If the Work includes a "NOTICE" text file as part of its
+| distribution, then any Derivative Works that You distribute must
+| include a readable copy of the attribution notices contained
+| within such NOTICE file, excluding those notices that do not
+| pertain to any part of the Derivative Works, in at least one
+| of the following places: within a NOTICE text file distributed
+| as part of the Derivative Works; within the Source form or
+| documentation, if provided along with the Derivative Works; or,
+| within a display generated by the Derivative Works, if and
+| wherever such third-party notices normally appear. The contents
+| of the NOTICE file are for informational purposes only and
+| do not modify the License. You may add Your own attribution
+| notices within Derivative Works that You distribute, alongside
+| or as an addendum to the NOTICE text from the Work, provided
+| that such additional attribution notices cannot be construed
+| as modifying the License.
+|
+| You may add Your own copyright statement to Your modifications and
+| may provide additional or different license terms and conditions
+| for use, reproduction, or distribution of Your modifications, or
+| for any such Derivative Works as a whole, provided Your use,
+| reproduction, and distribution of the Work otherwise complies with
+| the conditions stated in this License.
+|
+| 5. Submission of Contributions. Unless You explicitly state otherwise,
+| any Contribution intentionally submitted for inclusion in the Work
+| by You to the Licensor shall be under the terms and conditions of
+| this License, without any additional terms or conditions.
+| Notwithstanding the above, nothing herein shall supersede or modify
+| the terms of any separate license agreement you may have executed
+| with Licensor regarding such Contributions.
+|
+| 6. Trademarks. This License does not grant permission to use the trade
+| names, trademarks, service marks, or product names of the Licensor,
+| except as required for reasonable and customary use in describing the
+| origin of the Work and reproducing the content of the NOTICE file.
+|
+| 7. Disclaimer of Warranty. Unless required by applicable law or
+| agreed to in writing, Licensor provides the Work (and each
+| Contributor provides its Contributions) on an "AS IS" BASIS,
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+| implied, including, without limitation, any warranties or conditions
+| of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+| PARTICULAR PURPOSE. You are solely responsible for determining the
+| appropriateness of using or redistributing the Work and assume any
+| risks associated with Your exercise of permissions under this License.
+|
+| 8. Limitation of Liability. In no event and under no legal theory,
+| whether in tort (including negligence), contract, or otherwise,
+| unless required by applicable law (such as deliberate and grossly
+| negligent acts) or agreed to in writing, shall any Contributor be
+| liable to You for damages, including any direct, indirect, special,
+| incidental, or consequential damages of any character arising as a
+| result of this License or out of the use or inability to use the
+| Work (including but not limited to damages for loss of goodwill,
+| work stoppage, computer failure or malfunction, or any and all
+| other commercial damages or losses), even if such Contributor
+| has been advised of the possibility of such damages.
+|
+| 9. Accepting Warranty or Additional Liability. While redistributing
+| the Work or Derivative Works thereof, You may choose to offer,
+| and charge a fee for, acceptance of support, warranty, indemnity,
+| or other liability obligations and/or rights consistent with this
+| License. However, in accepting such obligations, You may act only
+| on Your own behalf and on Your sole responsibility, not on behalf
+| of any other Contributor, and only if You agree to indemnify,
+| defend, and hold each Contributor harmless for any liability
+| incurred by, or claims asserted against, such Contributor by reason
+| of your accepting any such warranty or additional liability.
+|
+| END OF TERMS AND CONDITIONS
+|
+| APPENDIX: How to apply the Apache License to your work.
+|
+| To apply the Apache License to your work, attach the following
+| boilerplate notice, with the fields enclosed by brackets "[]"
+| replaced with your own identifying information. (Don't include
+| the brackets!) The text should be enclosed in the appropriate
+| comment syntax for the file format. We also recommend that a
+| file or class name and description of purpose be included on the
+| same "printed page" as the copyright notice for easier
+| identification within third-party archives.
+|
+| Copyright [yyyy] [name of copyright owner]
+|
+| 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.
+|
+|
+| Licenses for support code
+| -------------------------
+|
+| Parts of the TLS test suite are under the Go license. This code is not included
+| in BoringSSL (i.e. libcrypto and libssl) when compiled, however, so
+| distributing code linked against BoringSSL does not trigger this license:
+|
+| Copyright (c) 2009 The Go Authors. All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are
+| met:
+|
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above
+| copyright notice, this list of conditions and the following disclaimer
+| in the documentation and/or other materials provided with the
+| distribution.
+| * Neither the name of Google Inc. nor the names of its
+| contributors may be used to endorse or promote products derived from
+| this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+|
+| BoringSSL uses the Chromium test infrastructure to run a continuous build,
+| trybots etc. The scripts which manage this, and the script for generating build
+| metadata, are under the Chromium license. Distributing code linked against
+| BoringSSL does not trigger this license.
+|
+| Copyright 2015 The Chromium Authors. All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are
+| met:
+|
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above
+| copyright notice, this list of conditions and the following disclaimer
+| in the documentation and/or other materials provided with the
+| distribution.
+| * Neither the name of Google Inc. nor the names of its
+| contributors may be used to endorse or promote products derived from
+| this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License file: LICENSE-other-bits
+| Copyright 2015-2025 Brian Smith.
+|
+| Permission to use, copy, modify, and/or distribute this software for any
+| purpose with or without fee is hereby granted, provided that the above
+| copyright notice and 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.
+
+License file: src/polyfill/once_cell/LICENSE-APACHE
+| Apache License
+| Version 2.0, January 2004
+| http://www.apache.org/licenses/
+|
+| TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+|
+| 1. Definitions.
+|
+| "License" shall mean the terms and conditions for use, reproduction,
+| and distribution as defined by Sections 1 through 9 of this document.
+|
+| "Licensor" shall mean the copyright owner or entity authorized by
+| the copyright owner that is granting the License.
+|
+| "Legal Entity" shall mean the union of the acting entity and all
+| other entities that control, are controlled by, or are under common
+| control with that entity. For the purposes of this definition,
+| "control" means (i) the power, direct or indirect, to cause the
+| direction or management of such entity, whether by contract or
+| otherwise, or (ii) ownership of fifty percent (50%) or more of the
+| outstanding shares, or (iii) beneficial ownership of such entity.
+|
+| "You" (or "Your") shall mean an individual or Legal Entity
+| exercising permissions granted by this License.
+|
+| "Source" form shall mean the preferred form for making modifications,
+| including but not limited to software source code, documentation
+| source, and configuration files.
+|
+| "Object" form shall mean any form resulting from mechanical
+| transformation or translation of a Source form, including but
+| not limited to compiled object code, generated documentation,
+| and conversions to other media types.
+|
+| "Work" shall mean the work of authorship, whether in Source or
+| Object form, made available under the License, as indicated by a
+| copyright notice that is included in or attached to the work
+| (an example is provided in the Appendix below).
+|
+| "Derivative Works" shall mean any work, whether in Source or Object
+| form, that is based on (or derived from) the Work and for which the
+| editorial revisions, annotations, elaborations, or other modifications
+| represent, as a whole, an original work of authorship. For the purposes
+| of this License, Derivative Works shall not include works that remain
+| separable from, or merely link (or bind by name) to the interfaces of,
+| the Work and Derivative Works thereof.
+|
+| "Contribution" shall mean any work of authorship, including
+| the original version of the Work and any modifications or additions
+| to that Work or Derivative Works thereof, that is intentionally
+| submitted to Licensor for inclusion in the Work by the copyright owner
+| or by an individual or Legal Entity authorized to submit on behalf of
+| the copyright owner. For the purposes of this definition, "submitted"
+| means any form of electronic, verbal, or written communication sent
+| to the Licensor or its representatives, including but not limited to
+| communication on electronic mailing lists, source code control systems,
+| and issue tracking systems that are managed by, or on behalf of, the
+| Licensor for the purpose of discussing and improving the Work, but
+| excluding communication that is conspicuously marked or otherwise
+| designated in writing by the copyright owner as "Not a Contribution."
+|
+| "Contributor" shall mean Licensor and any individual or Legal Entity
+| on behalf of whom a Contribution has been received by Licensor and
+| subsequently incorporated within the Work.
+|
+| 2. Grant of Copyright License. Subject to the terms and conditions of
+| this License, each Contributor hereby grants to You a perpetual,
+| worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+| copyright license to reproduce, prepare Derivative Works of,
+| publicly display, publicly perform, sublicense, and distribute the
+| Work and such Derivative Works in Source or Object form.
+|
+| 3. Grant of Patent License. Subject to the terms and conditions of
+| this License, each Contributor hereby grants to You a perpetual,
+| worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+| (except as stated in this section) patent license to make, have made,
+| use, offer to sell, sell, import, and otherwise transfer the Work,
+| where such license applies only to those patent claims licensable
+| by such Contributor that are necessarily infringed by their
+| Contribution(s) alone or by combination of their Contribution(s)
+| with the Work to which such Contribution(s) was submitted. If You
+| institute patent litigation against any entity (including a
+| cross-claim or counterclaim in a lawsuit) alleging that the Work
+| or a Contribution incorporated within the Work constitutes direct
+| or contributory patent infringement, then any patent licenses
+| granted to You under this License for that Work shall terminate
+| as of the date such litigation is filed.
+|
+| 4. Redistribution. You may reproduce and distribute copies of the
+| Work or Derivative Works thereof in any medium, with or without
+| modifications, and in Source or Object form, provided that You
+| meet the following conditions:
+|
+| (a) You must give any other recipients of the Work or
+| Derivative Works a copy of this License; and
+|
+| (b) You must cause any modified files to carry prominent notices
+| stating that You changed the files; and
+|
+| (c) You must retain, in the Source form of any Derivative Works
+| that You distribute, all copyright, patent, trademark, and
+| attribution notices from the Source form of the Work,
+| excluding those notices that do not pertain to any part of
+| the Derivative Works; and
+|
+| (d) If the Work includes a "NOTICE" text file as part of its
+| distribution, then any Derivative Works that You distribute must
+| include a readable copy of the attribution notices contained
+| within such NOTICE file, excluding those notices that do not
+| pertain to any part of the Derivative Works, in at least one
+| of the following places: within a NOTICE text file distributed
+| as part of the Derivative Works; within the Source form or
+| documentation, if provided along with the Derivative Works; or,
+| within a display generated by the Derivative Works, if and
+| wherever such third-party notices normally appear. The contents
+| of the NOTICE file are for informational purposes only and
+| do not modify the License. You may add Your own attribution
+| notices within Derivative Works that You distribute, alongside
+| or as an addendum to the NOTICE text from the Work, provided
+| that such additional attribution notices cannot be construed
+| as modifying the License.
+|
+| You may add Your own copyright statement to Your modifications and
+| may provide additional or different license terms and conditions
+| for use, reproduction, or distribution of Your modifications, or
+| for any such Derivative Works as a whole, provided Your use,
+| reproduction, and distribution of the Work otherwise complies with
+| the conditions stated in this License.
+|
+| 5. Submission of Contributions. Unless You explicitly state otherwise,
+| any Contribution intentionally submitted for inclusion in the Work
+| by You to the Licensor shall be under the terms and conditions of
+| this License, without any additional terms or conditions.
+| Notwithstanding the above, nothing herein shall supersede or modify
+| the terms of any separate license agreement you may have executed
+| with Licensor regarding such Contributions.
+|
+| 6. Trademarks. This License does not grant permission to use the trade
+| names, trademarks, service marks, or product names of the Licensor,
+| except as required for reasonable and customary use in describing the
+| origin of the Work and reproducing the content of the NOTICE file.
+|
+| 7. Disclaimer of Warranty. Unless required by applicable law or
+| agreed to in writing, Licensor provides the Work (and each
+| Contributor provides its Contributions) on an "AS IS" BASIS,
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+| implied, including, without limitation, any warranties or conditions
+| of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+| PARTICULAR PURPOSE. You are solely responsible for determining the
+| appropriateness of using or redistributing the Work and assume any
+| risks associated with Your exercise of permissions under this License.
+|
+| 8. Limitation of Liability. In no event and under no legal theory,
+| whether in tort (including negligence), contract, or otherwise,
+| unless required by applicable law (such as deliberate and grossly
+| negligent acts) or agreed to in writing, shall any Contributor be
+| liable to You for damages, including any direct, indirect, special,
+| incidental, or consequential damages of any character arising as a
+| result of this License or out of the use or inability to use the
+| Work (including but not limited to damages for loss of goodwill,
+| work stoppage, computer failure or malfunction, or any and all
+| other commercial damages or losses), even if such Contributor
+| has been advised of the possibility of such damages.
+|
+| 9. Accepting Warranty or Additional Liability. While redistributing
+| the Work or Derivative Works thereof, You may choose to offer,
+| and charge a fee for, acceptance of support, warranty, indemnity,
+| or other liability obligations and/or rights consistent with this
+| License. However, in accepting such obligations, You may act only
+| on Your own behalf and on Your sole responsibility, not on behalf
+| of any other Contributor, and only if You agree to indemnify,
+| defend, and hold each Contributor harmless for any liability
+| incurred by, or claims asserted against, such Contributor by reason
+| of your accepting any such warranty or additional liability.
+|
+| END OF TERMS AND CONDITIONS
+|
+| APPENDIX: How to apply the Apache License to your work.
+|
+| To apply the Apache License to your work, attach the following
+| boilerplate notice, with the fields enclosed by brackets "[]"
+| replaced with your own identifying information. (Don't include
+| the brackets!) The text should be enclosed in the appropriate
+| comment syntax for the file format. We also recommend that a
+| file or class name and description of purpose be included on the
+| same "printed page" as the copyright notice for easier
+| identification within third-party archives.
+|
+| Copyright [yyyy] [name of copyright owner]
+|
+| 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.
+
+License file: src/polyfill/once_cell/LICENSE-MIT
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHOR OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+
+License file: third_party/fiat/LICENSE
+| The Apache License, Version 2.0 (Apache-2.0)
+|
+| Copyright 2015-2020 the fiat-crypto authors (see the AUTHORS file)
+|
+| 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.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate rust-ini@0.21.3.
+Project URL: https://github.com/zonyitoo/rust-ini
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| The MIT License (MIT)
+|
+| Copyright (c) 2014 Y. T. CHUNG
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate rustls-webpki@0.103.13.
+Project URL: https://github.com/rustls/webpki
+Declared license: ISC
+Selected crate license: ISC
+
+License file: LICENSE
+| Except as otherwise noted, this project is licensed under the following
+| (ISC-style) terms:
+|
+| Copyright 2015 Brian Smith.
+|
+| Permission to use, copy, modify, and/or distribute this software for any
+| purpose with or without fee is hereby granted, provided that the above
+| copyright notice and this permission notice appear in all copies.
+|
+| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
+| WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+| MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS 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.
+|
+| The files under third-party/chromium are licensed as described in
+| third-party/chromium/LICENSE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate slab@0.4.12.
+Project URL: https://github.com/tokio-rs/slab
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2019 Carl Lerche
+|
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate strsim@0.11.1.
+Project URL: https://github.com/rapidfuzz/strsim-rs
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| The MIT License (MIT)
+|
+| Copyright (c) 2015 Danny Guo
+| Copyright (c) 2016 Titus Wormer <ti...@gmail.com>
+| Copyright (c) 2018 Akash Kurdekar
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate strum@0.26.3.
+Project URL: https://github.com/Peternator7/strum
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| MIT License
+|
+| Copyright (c) 2019 Peter Glotfelty
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate subtle@2.6.1.
+Project URL: https://dalek.rs/
+Declared license: BSD-3-Clause
+Selected crate license: BSD-3-Clause
+
+License file: LICENSE
+| Copyright (c) 2016-2017 Isis Agora Lovecruft, Henry de Valence. All rights reserved.
+| Copyright (c) 2016-2024 Isis Agora Lovecruft. All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are
+| met:
+|
+| 1. Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+|
+| 2. Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+|
+| 3. Neither the name of the copyright holder nor the names of its
+| contributors may be used to endorse or promote products derived from
+| this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+| IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+| TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+| PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+| HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+| TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+| PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+| LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+| NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate tap@1.0.1.
+Project URL: https://github.com/myrrlyn/tap
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE.txt
+| MIT License
+|
+| Copyright (c) 2017 Elliot Linder <da...@gmail.com>
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate tokio@1.52.3.
+Project URL: https://tokio.rs
+Declared license: MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate tokio-util@0.7.18.
+Project URL: https://tokio.rs
+Declared license: MIT
+Selected crate license: MIT
+
+These crates ship identical license text, reproduced once below.
+
+License file: LICENSE
+| MIT License
+|
+| Copyright (c) Tokio Contributors
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate tower@0.5.3.
+Project URL: https://github.com/tower-rs/tower
+Declared license: MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate tower-layer@0.3.3.
+Project URL: https://github.com/tower-rs/tower
+Declared license: MIT
+Selected crate license: MIT
+
+The Python wheels use the Rust crate tower-service@0.3.3.
+Project URL: https://github.com/tower-rs/tower
+Declared license: MIT
+Selected crate license: MIT
+
+These crates ship identical license text, reproduced once below.
+
+License file: LICENSE
+| Copyright (c) 2019 Tower Contributors
+|
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate tower-http@0.6.8.
+Project URL: https://github.com/tower-rs/tower-http
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2019-2021 Tower Contributors
+|
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate tracing@0.1.44.
+Project URL: https://tokio.rs
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2019 Tokio Contributors
+|
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate tracing-core@0.1.36.
+Project URL: https://tokio.rs
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2019 Tokio Contributors
+|
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+
+License file: src/spin/LICENSE
+| The MIT License (MIT)
+|
+| Copyright (c) 2014 Mathijs van de Nes
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate try-lock@0.2.5.
+Project URL: https://github.com/seanmonstar/try-lock
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2018-2023 Sean McArthur
+| Copyright (c) 2016 Alex Crichton
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in
+| all copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+| THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate twox-hash@2.1.2.
+Project URL: https://github.com/shepmaster/twox-hash
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE.txt
+| The MIT License (MIT)
+|
+| Copyright (c) 2015 Jake Goulding
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all
+| copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+| SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate untrusted@0.9.0.
+Project URL: https://github.com/briansmith/untrusted
+Declared license: ISC
+Selected crate license: ISC
+
+License file: LICENSE.txt
+| // Copyright 2015-2016 Brian Smith.
+| //
+| // Permission to use, copy, modify, and/or distribute this software for any
+| // purpose with or without fee is hereby granted, provided that the above
+| // copyright notice and this permission notice appear in all copies.
+| //
+| // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
+| // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+| // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS 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.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate want@0.3.1.
+Project URL: https://github.com/seanmonstar/want
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| Copyright (c) 2018-2019 Sean McArthur
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy
+| of this software and associated documentation files (the "Software"), to deal
+| in the Software without restriction, including without limitation the rights
+| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+| copies of the Software, and to permit persons to whom the Software is
+| furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in
+| all copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+| THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate webpki-roots@1.0.6.
+Project URL: https://github.com/rustls/webpki-roots
+Declared license: CDLA-Permissive-2.0
+Selected crate license: CDLA-Permissive-2.0
+
+License file: LICENSE
+| # Community Data License Agreement - Permissive - Version 2.0
+|
+| This is the Community Data License Agreement - Permissive, Version
+| 2.0 (the "agreement"). Data Provider(s) and Data Recipient(s) agree
+| as follows:
+|
+| ## 1. Provision of the Data
+|
+| 1.1. A Data Recipient may use, modify, and share the Data made
+| available by Data Provider(s) under this agreement if that Data
+| Recipient follows the terms of this agreement.
+|
+| 1.2. This agreement does not impose any restriction on a Data
+| Recipient's use, modification, or sharing of any portions of the
+| Data that are in the public domain or that may be used, modified,
+| or shared under any other legal exception or limitation.
+|
+| ## 2. Conditions for Sharing Data
+|
+| 2.1. A Data Recipient may share Data, with or without modifications, so
+| long as the Data Recipient makes available the text of this agreement
+| with the shared Data.
+|
+| ## 3. No Restrictions on Results
+|
+| 3.1. This agreement does not impose any restriction or obligations
+| with respect to the use, modification, or sharing of Results.
+|
+| ## 4. No Warranty; Limitation of Liability
+|
+| 4.1. All Data Recipients receive the Data subject to the following
+| terms:
+|
+| THE DATA IS PROVIDED ON AN "AS IS" BASIS, WITHOUT REPRESENTATIONS,
+| WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED
+| INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
+| NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+|
+| NO DATA PROVIDER SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+| INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+| WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+| LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+| NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE DATA OR RESULTS,
+| EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+|
+| ## 5. Definitions
+|
+| 5.1. "Data" means the material received by a Data Recipient under
+| this agreement.
+|
+| 5.2. "Data Provider" means any person who is the source of Data
+| provided under this agreement and in reliance on a Data Recipient's
+| agreement to its terms.
+|
+| 5.3. "Data Recipient" means any person who receives Data directly
+| or indirectly from a Data Provider and agrees to the terms of this
+| agreement.
+|
+| 5.4. "Results" means any outcome obtained by computational analysis
+| of Data, including for example machine learning models and models'
+| insights.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate zmij@1.0.21.
+Project URL: https://github.com/dtolnay/zmij
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE-MIT
+| Permission is hereby granted, free of charge, to any
+| person obtaining a copy of this software and associated
+| documentation files (the "Software"), to deal in the
+| Software without restriction, including without
+| limitation the rights to use, copy, modify, merge,
+| publish, distribute, sublicense, and/or sell copies of
+| the Software, and to permit persons to whom the Software
+| is furnished to do so, subject to the following
+| conditions:
+|
+| The above copyright notice and this permission notice
+| shall be included in all copies or substantial portions
+| of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+| ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+| TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+| SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+| IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+| DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate zstd@0.13.3.
+Project URL: https://github.com/gyscos/zstd-rs
+Declared license: MIT
+Selected crate license: MIT
+
+License file: LICENSE
+| The MIT License (MIT)
+| Copyright (c) 2016 Alexandre Bury
+|
+| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+|
+| The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+|
+| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+--------------------------------------------------------------------------------
+
+The Python wheels use the Rust crate zstd-sys@2.0.16+zstd.1.5.7.
+Project URL: https://github.com/gyscos/zstd-rs
+Declared license: MIT/Apache-2.0
+Selected crate license: Apache-2.0
+
+License file: LICENSE.BSD-3-Clause
+| The auto-generated bindings are under the 3-clause BSD license:
+|
+| BSD License
+|
+| For Zstandard software
+|
+| Copyright (c) 2016-present, Facebook, Inc. All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without modification,
+| are permitted provided that the following conditions are met:
+|
+| * Redistributions of source code must retain the above copyright notice, this
+| list of conditions and the following disclaimer.
+|
+| * Redistributions in binary form must reproduce the above copyright notice,
+| this list of conditions and the following disclaimer in the documentation
+| and/or other materials provided with the distribution.
+|
+| * Neither the name Facebook nor the names of its contributors may be used to
+| endorse or promote products derived from this software without specific
+| prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+| ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+| ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License file: zstd/LICENSE
+| BSD License
+|
+| For Zstandard software
+|
+| Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without modification,
+| are permitted provided that the following conditions are met:
+|
+| * Redistributions of source code must retain the above copyright notice, this
+| list of conditions and the following disclaimer.
+|
+| * Redistributions in binary form must reproduce the above copyright notice,
+| this list of conditions and the following disclaimer in the documentation
+| and/or other materials provided with the distribution.
+|
+| * Neither the name Facebook, nor Meta, nor the names of its contributors may
+| be used to endorse or promote products derived from this software without
+| specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+| ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+| ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/fluss-rust/bindings/python/NOTICE-bin b/fluss-rust/bindings/python/NOTICE-bin
new file mode 100644
index 000000000..1d7dca863
--- /dev/null
+++ b/fluss-rust/bindings/python/NOTICE-bin
@@ -0,0 +1,33 @@
+Apache Fluss Python
+Copyright 2025-2026 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+Apache Flink
+Copyright 2014-2024 The Apache Software Foundation
+
+Apache Kafka
+Copyright 2012-2024 The Apache Software Foundation
+
+Apache Paimon
+Copyright 2023-2024 The Apache Software Foundation
+
+
+--------------------------------------------------------------------------------
+
+The following notice applies to: arrow-arith@59.0.0, arrow-array@59.0.0, arrow-buffer@59.0.0, arrow-cast@59.0.0, arrow-csv@59.0.0, arrow-data@59.0.0, arrow-ipc@59.0.0, arrow-json@59.0.0, arrow-ord@59.0.0, arrow-row@59.0.0, arrow-schema@59.0.0, arrow-select@59.0.0, arrow-string@59.0.0, arrow@59.0.0
+
+Apache Arrow
+Copyright 2016-2026 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+This product includes software from the chronoutil crate (MIT)
+ * Copyright (c) 2020-2022 Oliver Margetts
+ * https://github.com/olliemath/chronoutil
+
+This product includes software from the compact-thrift project (Apache 2.0)
+ * Copyright Jörn Horstmann
+ * https://github.com/jhorstmann/compact-thrift
diff --git a/fluss-rust/bindings/python/generate_binary_license.py b/fluss-rust/bindings/python/generate_binary_license.py
new file mode 100644
index 000000000..8d2fd5433
--- /dev/null
+++ b/fluss-rust/bindings/python/generate_binary_license.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+"""Generate legal files for the Rust code statically linked into Python wheels."""
+
+import argparse
+import sys
+from pathlib import Path
+
+PYTHON_DIR = Path(__file__).resolve().parent
+REPOSITORY_ROOT = PYTHON_DIR.parents[2]
+sys.path.insert(0, str(REPOSITORY_ROOT / "tools" / "releasing"))
+import generate_rust_license as generator
+
+# Keep this list aligned with the wheel matrix in python-release.yml.
+TARGETS = (
+ "x86_64-pc-windows-msvc",
+ "x86_64-apple-darwin",
+ "aarch64-apple-darwin",
+ "x86_64-unknown-linux-gnu",
+ "aarch64-unknown-linux-gnu",
+)
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--check", action="store_true", help="fail on stale files")
+ parser.add_argument(
+ "--target",
+ action="append",
+ choices=TARGETS,
+ help="wheel target; defaults to the union of release targets",
+ )
+ args = parser.parse_args()
+ targets = args.target or TARGETS
+ packages = generator.runtime_packages(PYTHON_DIR, targets, "fluss_python")
+ description = (
+ "This LICENSE covers Rust dependencies statically linked into the Python\n"
+ "extension for: " + ", ".join(targets) + ".\n"
+ "When multiple targets are listed, target-specific crates may only be linked\n"
+ "into the corresponding wheels. Dynamically installed Python dependencies\n"
+ "such as pandas and pyarrow carry their own licenses."
+ )
+ generator.write_generated_files(
+ REPOSITORY_ROOT,
+ {
+ PYTHON_DIR / "LICENSE-bin": generator.generate_license(
+ REPOSITORY_ROOT, packages, "The Python wheels", description
+ ),
+ PYTHON_DIR / "NOTICE-bin": generator.generate_notice(
+ REPOSITORY_ROOT, packages, (PYTHON_DIR / "NOTICE").read_text()
+ ),
+ },
+ args.check,
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/fluss-rust/bindings/python/pyproject.toml b/fluss-rust/bindings/python/pyproject.toml
index 2baf04673..c236f83a8 100644
--- a/fluss-rust/bindings/python/pyproject.toml
+++ b/fluss-rust/bindings/python/pyproject.toml
@@ -24,7 +24,7 @@ name = "pyfluss"
description = "Apache Fluss Python client"
authors = [{name = "Apache Fluss", email = "dev@fluss.apache.org"}]
license = "Apache-2.0"
-license-files = ["LICENSE", "NOTICE"]
+license-files = ["LICENSE", "NOTICE", "LICENSE-bin", "NOTICE-bin"]
readme = "PYPI_README.md"
requires-python = ">=3.9"
classifiers = [
diff --git a/fluss-gateway/scripts/generate_binary_license.py b/tools/releasing/generate_rust_license.py
old mode 100755
new mode 100644
similarity index 78%
copy from fluss-gateway/scripts/generate_binary_license.py
copy to tools/releasing/generate_rust_license.py
index 512b147a3..b9a5d14c6
--- a/fluss-gateway/scripts/generate_binary_license.py
+++ b/tools/releasing/generate_rust_license.py
@@ -17,22 +17,15 @@
# specific language governing permissions and limitations
# under the License.
-"""Generate LICENSE-bin and NOTICE-bin for the shipped Linux Gateway binary."""
+"""Generate license and notice texts for statically linked Rust dependencies."""
-import argparse
import hashlib
import json
-from pathlib import Path
import re
import subprocess
-from typing import Dict, Iterable, List, Set, Tuple
-
+from pathlib import Path
+from typing import Dict, Iterable, List, Optional, Set, Tuple
-TARGETS = (
- "x86_64-unknown-linux-gnu",
- "aarch64-unknown-linux-gnu",
-)
-LOCAL_PACKAGES = {"fluss-gateway", "fluss-rs"}
SEPARATOR = "-" * 80
# These licenses cover incorporated code or data, independently of the crate's
@@ -44,12 +37,12 @@ INCORPORATED_LICENSE_FILES = {
}
-def cargo_metadata(gateway_dir: Path, target: str) -> dict:
+def cargo_metadata(package_dir: Path, target: str) -> dict:
command = [
"cargo",
"metadata",
"--manifest-path",
- str(gateway_dir / "Cargo.toml"),
+ str(package_dir / "Cargo.toml"),
"--locked",
"--format-version",
"1",
@@ -60,23 +53,28 @@ def cargo_metadata(gateway_dir: Path, target: str) -> dict:
def is_proc_macro(package: dict) -> bool:
- return any(
- "proc-macro" in target["kind"] for target in package.get("targets", ())
- )
+ return any("proc-macro" in target["kind"] for target in package.get("targets", ()))
-def runtime_packages(gateway_dir: Path) -> List[dict]:
+def runtime_packages(
+ package_dir: Path, targets: Iterable[str], root_name: str
+) -> List[dict]:
packages: Dict[str, dict] = {}
runtime_ids: Set[str] = set()
- for target in TARGETS:
- metadata = cargo_metadata(gateway_dir, target)
- target_packages = {
- package["id"]: package for package in metadata["packages"]
- }
+ for target in targets:
+ metadata = cargo_metadata(package_dir, target)
+ target_packages = {package["id"]: package for package in metadata["packages"]}
packages.update(target_packages)
nodes = {node["id"]: node for node in metadata["resolve"]["nodes"]}
- pending = [metadata["resolve"]["root"]]
+ roots = [
+ package["id"]
+ for package in metadata["packages"]
+ if package["name"] == root_name and package["source"] is None
+ ]
+ if len(roots) != 1:
+ raise RuntimeError(f"Expected one local package named {root_name}.")
+ pending = roots
target_ids: Set[str] = set()
while pending:
@@ -86,10 +84,9 @@ def runtime_packages(gateway_dir: Path) -> List[dict]:
target_ids.add(package_id)
runtime_ids.add(package_id)
for dependency in nodes[package_id]["deps"]:
- if (
- any(kind["kind"] is None for kind in dependency["dep_kinds"])
- and not is_proc_macro(target_packages[dependency["pkg"]])
- ):
+ if any(
+ kind["kind"] is None for kind in dependency["dep_kinds"]
+ ) and not is_proc_macro(target_packages[dependency["pkg"]]):
pending.append(dependency["pkg"])
return sorted(
@@ -126,8 +123,7 @@ def license_terms(expression: str) -> Tuple[str, ...]:
break
else:
raise RuntimeError(
- "No approved binary license selection for expression "
- f"{expression!r}."
+ f"No approved binary license selection for expression {expression!r}."
)
return tuple(dict.fromkeys(selected))
@@ -172,9 +168,7 @@ def crate_license_files(package: dict, selected_terms: Tuple[str, ...]) -> List[
"CDLA-Permissive-2.0": ("cdla",),
}
tokens = tuple(
- token
- for selected in selected_terms
- for token in tokens_by_license[selected]
+ token for selected in selected_terms for token in tokens_by_license[selected]
)
matched = [
path
@@ -216,10 +210,7 @@ def is_standalone_apache_license(path: Path) -> bool:
"Apache License" in first_line
and "Version 2.0" in text
and "TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION" in text
- and (
- "apache" in name
- or name in {"license", "license.txt", "license.md"}
- )
+ and ("apache" in name or name in {"license", "license.txt", "license.md"})
)
@@ -256,16 +247,18 @@ def indent(text: str) -> str:
return "\n".join(lines)
-def generate_license(repository_root: Path, packages: Iterable[dict]) -> str:
+def generate_license(
+ repository_root: Path,
+ packages: Iterable[dict],
+ distribution: str,
+ description: str,
+) -> str:
sections = [
apache_license(repository_root),
"",
SEPARATOR,
"",
- "This LICENSE covers the supported amd64 and arm64 Linux Gateway",
- "convenience binaries. Their linked dependency sets are almost identical,",
- "but a target-specific crate may appear here even when it is not linked into",
- "the other architecture's executable.",
+ description,
]
apache_dependencies: List[str] = []
# Crates that ship byte-identical license text share a single reproduction, which
@@ -275,7 +268,7 @@ def generate_license(repository_root: Path, packages: Iterable[dict]) -> str:
reproductions: Dict[Tuple[Tuple[str, str], ...], List[List[str]]] = {}
for package in packages:
- if package["source"] is None and package["name"] in LOCAL_PACKAGES:
+ if package["source"] is None:
continue
expression = package.get("license")
if not expression:
@@ -292,9 +285,11 @@ def generate_license(repository_root: Path, packages: Iterable[dict]) -> str:
continue
package_dir = Path(package["manifest_path"]).parent
- homepage = package.get("homepage") or package.get("repository") or "(not provided)"
+ homepage = (
+ package.get("homepage") or package.get("repository") or "(not provided)"
+ )
attribution = [
- f"The supported Linux Gateway binaries use the Rust crate {package_name}.",
+ f"{distribution} use the Rust crate {package_name}.",
f"Project URL: {homepage}",
f"Declared license: {expression}",
f"Selected crate license: {' AND '.join(selected_terms)}",
@@ -330,7 +325,7 @@ def generate_license(repository_root: Path, packages: Iterable[dict]) -> str:
"",
SEPARATOR,
"",
- "The supported Linux Gateway binaries include the following Rust crates",
+ f"{distribution} include the following Rust crates",
"under the Apache License, Version 2.0. Crates with additional conjunctive",
"license obligations or incorporated components with separate licenses",
"are also reproduced in the sections below.",
@@ -342,11 +337,13 @@ def generate_license(repository_root: Path, packages: Iterable[dict]) -> str:
return "\n".join(sections).rstrip() + "\n"
-def generate_notice(repository_root: Path, packages: Iterable[dict]) -> str:
+def generate_notice(
+ repository_root: Path, packages: Iterable[dict], source_notice: Optional[str] = None
+) -> str:
unique_notices: Dict[str, Tuple[str, List[str]]] = {}
for package in packages:
- if package["source"] is None and package["name"] in LOCAL_PACKAGES:
+ if package["source"] is None:
continue
package_dir = Path(package["manifest_path"]).parent
for path in sorted(package_dir.glob("NOTICE*")):
@@ -356,11 +353,9 @@ def generate_notice(repository_root: Path, packages: Iterable[dict]) -> str:
digest = hashlib.sha256(text.encode("utf-8")).hexdigest()
if digest not in unique_notices:
unique_notices[digest] = (text, [])
- unique_notices[digest][1].append(
- f"{package['name']}@{package['version']}"
- )
+ unique_notices[digest][1].append(f"{package['name']}@{package['version']}")
- sections = [gateway_notice(repository_root)]
+ sections = [source_notice or gateway_notice(repository_root)]
for text, package_names in sorted(
unique_notices.values(), key=lambda item: item[1]
):
@@ -369,8 +364,7 @@ def generate_notice(repository_root: Path, packages: Iterable[dict]) -> str:
"",
SEPARATOR,
"",
- "The following notice applies to: "
- + ", ".join(sorted(package_names)),
+ "The following notice applies to: " + ", ".join(sorted(package_names)),
"",
text,
]
@@ -378,38 +372,20 @@ def generate_notice(repository_root: Path, packages: Iterable[dict]) -> str:
return "\n".join(sections).rstrip() + "\n"
-def main() -> None:
- parser = argparse.ArgumentParser()
- parser.add_argument(
- "--check",
- action="store_true",
- help="fail instead of updating files when generated content differs",
- )
- args = parser.parse_args()
-
- gateway_dir = Path(__file__).resolve().parent.parent
- repository_root = gateway_dir.parent
- packages = runtime_packages(gateway_dir)
- generated = {
- gateway_dir / "LICENSE-bin": generate_license(repository_root, packages),
- gateway_dir / "NOTICE-bin": generate_notice(repository_root, packages),
- }
-
+def write_generated_files(
+ repository_root: Path, generated: Dict[Path, str], check: bool
+) -> None:
changed = []
for path, contents in generated.items():
current = path.read_text(encoding="utf-8") if path.exists() else None
if current == contents:
continue
changed.append(path)
- if not args.check:
+ if not check:
path.write_text(contents, encoding="utf-8")
- if args.check and changed:
+ if check and changed:
raise SystemExit(
- "Gateway binary license files are stale: "
+ "Binary license files are stale: "
+ ", ".join(str(path.relative_to(repository_root)) for path in changed)
)
-
-
-if __name__ == "__main__":
- main()
diff --git a/tools/releasing/test_generate_rust_license.py b/tools/releasing/test_generate_rust_license.py
new file mode 100644
index 000000000..eb999c6f4
--- /dev/null
+++ b/tools/releasing/test_generate_rust_license.py
@@ -0,0 +1,97 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+"""Check workspace root and target selection against real Cargo metadata."""
+
+import subprocess
+import tempfile
+import unittest
+from pathlib import Path
+
+import generate_rust_license as generator
+
+
+class RuntimeClosureTest(unittest.TestCase):
+ def test_only_selected_roots_normal_target_dependencies_are_included(self):
+ with tempfile.TemporaryDirectory() as directory:
+ root = Path(directory)
+ names = [
+ "binding",
+ "runtime",
+ "build_only",
+ "dev_only",
+ "derive",
+ "windows_only",
+ "sibling",
+ ]
+ (root / "Cargo.toml").write_text(
+ '[workspace]\nresolver = "2"\nmembers = ['
+ + ", ".join('"' + name + '"' for name in names)
+ + "]\n"
+ )
+ for name in names:
+ package = root / name
+ (package / "src").mkdir(parents=True)
+ (package / "src/lib.rs").write_text("")
+ manifest = '[package]\nname = "' + name + '"\nversion = "0.1.0"\n'
+ if name == "derive":
+ manifest += "[lib]\nproc-macro = true\n"
+ if name == "binding":
+ manifest += (
+ "[dependencies]\n"
+ 'runtime = { path = "../runtime" }\n'
+ 'derive = { path = "../derive" }\n'
+ "[build-dependencies]\n"
+ 'build_only = { path = "../build_only" }\n'
+ "[dev-dependencies]\n"
+ 'dev_only = { path = "../dev_only" }\n'
+ "[target.'cfg(windows)'.dependencies]\n"
+ 'windows_only = { path = "../windows_only" }\n'
+ )
+ (package / "Cargo.toml").write_text(manifest)
+ # A lockfile for path-only crates requires no registry access.
+ subprocess.run(
+ [
+ "cargo",
+ "generate-lockfile",
+ "--offline",
+ "--manifest-path",
+ str(root / "Cargo.toml"),
+ ],
+ check=True,
+ )
+ linux = generator.runtime_packages(
+ root, ["x86_64-unknown-linux-gnu"], "binding"
+ )
+ self.assertEqual(
+ {package["name"] for package in linux}, {"binding", "runtime"}
+ )
+ windows = generator.runtime_packages(
+ root, ["x86_64-pc-windows-msvc"], "binding"
+ )
+ self.assertEqual(
+ {package["name"] for package in windows},
+ {"binding", "runtime", "windows_only"},
+ )
+ with self.assertRaisesRegex(RuntimeError, "Expected one local package"):
+ generator.runtime_packages(
+ root, ["x86_64-unknown-linux-gnu"], "missing"
+ )
+
+
+if __name__ == "__main__":
+ unittest.main()
(fluss) 05/07: [license] Synchronize the copied source license inventory
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
wuchong pushed a commit to branch release-1.0
in repository https://gitbox.apache.org/repos/asf/fluss.git
commit 427c627202fddc9acb46ccdaf36663cb61b2c1ab
Author: Jark Wu <ja...@apache.org>
AuthorDate: Thu Sep 17 15:37:13 2026 +0800
[license] Synchronize the copied source license inventory
The root source inventory omitted explicitly
attributed Flink and Paimon files and retained moved or deleted paths.
Add the audited sources, update the HDFS plugin, Hadoop utility and
PredicateConverter paths, and remove the obsolete PaimonSnapshotScanner
entry. All 240 resulting source paths exist, and all 43 files identified
by the audit are now covered, including the Netty-derived source entry.
Co-Authored-By: Codex <no...@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 46/46
AI-Contributed/UT: 0/0
---
LICENSE | 46 ++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 42 insertions(+), 4 deletions(-)
diff --git a/LICENSE b/LICENSE
index 9a17cf6bd..199ba70b7 100644
--- a/LICENSE
+++ b/LICENSE
@@ -233,6 +233,8 @@ Apache Flink
./fluss-common/src/main/java/org/apache/fluss/memory/MemorySegment.java
./fluss-common/src/main/java/org/apache/fluss/memory/MemoryUtils.java
./fluss-common/src/main/java/org/apache/fluss/metrics/MeterView.java
+./fluss-common/src/main/java/org/apache/fluss/metrics/filter/DefaultMetricFilter.java
+./fluss-common/src/main/java/org/apache/fluss/metrics/filter/MetricFilter.java
./fluss-common/src/main/java/org/apache/fluss/metrics/groups/AbstractMetricGroup.java
./fluss-common/src/main/java/org/apache/fluss/metrics/groups/MetricGroup.java
./fluss-common/src/main/java/org/apache/fluss/metrics/registry/MetricRegistryImpl.java
@@ -265,18 +267,22 @@ Apache Flink
./fluss-common/src/main/java/org/apache/fluss/utils/types/Either.java
./fluss-common/src/main/java/org/apache/fluss/utils/types/Tuple.java
./fluss-common/src/main/java/org/apache/fluss/utils/types/Tuple2.java
+./fluss-common/src/test/java/org/apache/fluss/metrics/filter/DefaultMetricFilterTest.java
./fluss-filesystems/fluss-fs-hadoop/src/main/java/org/apache/fluss/fs/hdfs/HadoopDataInputStream.java
./fluss-filesystems/fluss-fs-hadoop/src/main/java/org/apache/fluss/fs/hdfs/HadoopDataOutputStream.java
./fluss-filesystems/fluss-fs-hadoop/src/main/java/org/apache/fluss/fs/hdfs/HadoopFileSystem.java
-./fluss-filesystems/fluss-fs-hadoop/src/main/java/org/apache/fluss/fs/hdfs/HadoopFsPlugin.java
-./fluss-filesystems/fluss-fs-hadoop/src/main/java/org/apache/fluss/fs/hdfs/utils/HadoopUtils.java
+./fluss-filesystems/fluss-fs-hdfs/src/main/java/org/apache/fluss/fs/hdfs/HdfsPlugin.java
+./fluss-filesystems/fluss-fs-hdfs/src/main/java/org/apache/fluss/fs/hdfs/utils/HadoopUtils.java
./fluss-filesystems/fluss-fs-oss/src/main/java/org/apache/fluss/fs/oss/OSSFileSystem.java
./fluss-filesystems/fluss-fs-oss/src/main/java/org/apache/fluss/fs/oss/OSSFileSystemPlugin.java
./fluss-filesystems/fluss-fs-s3/src/main/java/org/apache/fluss/fs/s3/token/S3DelegationTokenReceiver.java
./fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/utils/CatalogPropertiesUtils.java
./fluss-metrics/fluss-metrics-jmx/src/main/java/org/apache/fluss/metrics/jmx/JMXService.java
+./fluss-metrics/fluss-metrics-prometheus/src/main/java/org/apache/fluss/metrics/prometheus/AbstractPrometheusReporter.java
./fluss-metrics/fluss-metrics-prometheus/src/main/java/org/apache/fluss/metrics/prometheus/PrometheusReporter.java
./fluss-metrics/fluss-metrics-prometheus/src/main/java/org/apache/fluss/metrics/prometheus/PrometheusReporterPlugin.java
+./fluss-metrics/fluss-metrics-prometheus/src/test/java/org/apache/fluss/metrics/prometheus/PrometheusPushGatewayReporterPluginTest.java
+./fluss-rust/crates/fluss/src/util/murmur_hash.rs
./fluss-server/src/main/java/org/apache/fluss/server/kv/rocksdb/RocksDBKvBuilder.java
./fluss-server/src/main/java/org/apache/fluss/server/kv/rocksdb/RocksDBResourceContainer.java
./fluss-server/src/main/java/org/apache/fluss/server/kv/rocksdb/RocksDBWriteBatchWrapper.java
@@ -290,6 +296,7 @@ Apache Flink
./fluss-server/src/main/java/org/apache/fluss/server/metrics/ServerMetricUtils.java
./fluss-server/src/main/java/org/apache/fluss/server/utils/ResourceGuard.java
./fluss-server/src/main/java/org/apache/fluss/server/utils/ShutdownHookUtil.java
+./fluss-server/src/main/java/org/apache/fluss/server/utils/SignalHandler.java
./fluss-test-utils/src/main/java/org/apache/fluss/testutils/common/TestLoggerExtension.java
Apache Kafka
@@ -361,7 +368,6 @@ Apache Kafka
./fluss-server/src/main/java/org/apache/fluss/server/utils/timer/TimingWheel.java
Apache Paimon
-./fluss-common/src/main/java/org/apache/fluss/flink/utils/PredicateConverter.java
./fluss-common/src/main/java/org/apache/fluss/predicate/And.java
./fluss-common/src/main/java/org/apache/fluss/predicate/CompareUtils.java
./fluss-common/src/main/java/org/apache/fluss/predicate/CompoundPredicate.java
@@ -389,8 +395,40 @@ Apache Paimon
./fluss-common/src/main/java/org/apache/fluss/predicate/PredicateBuilder.java
./fluss-common/src/main/java/org/apache/fluss/predicate/PredicateVisitor.java
./fluss-common/src/main/java/org/apache/fluss/predicate/StartsWith.java
+./fluss-common/src/main/java/org/apache/fluss/row/decode/paimon/PaimonKeyDecoder.java
./fluss-common/src/main/java/org/apache/fluss/row/encode/paimon/PaimonBinaryRowWriter.java
-./fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/lakehouse/paimon/reader/PaimonSnapshotScanner.java
+./fluss-common/src/main/java/org/apache/fluss/utils/InternalRowUtils.java
+./fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/utils/PredicateConverter.java
+./fluss-lake/fluss-lake-paimon/src/main/java/org/apache/paimon/arrow/converter/Arrow2PaimonVectorConverter.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldAggregatorFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldBoolAndAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldBoolOrAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldFirstNonNullValueAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldFirstValueAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldLastNonNullValueAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldLastValueAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldListaggAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldMaxAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldMinAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldProductAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldRoaringBitmap32AggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldRoaringBitmap64AggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldStringAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/factory/FieldSumAggFactory.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldAggregator.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldBoolAndAgg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldBoolOrAgg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldFirstNonNullValueAgg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldFirstValueAgg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldLastNonNullValueAgg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldLastValueAgg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldListaggAgg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldMaxAgg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldMinAgg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldProductAgg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldRoaringBitmap32Agg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldRoaringBitmap64Agg.java
+./fluss-server/src/main/java/org/apache/fluss/server/kv/rowmerger/aggregate/functions/FieldSumAgg.java
Apache Spark
./fluss-rpc/src/main/java/org/apache/fluss/rpc/netty/NettyLogger.java
(fluss) 02/07: [license] Correct bundled Protobuf license declarations
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
wuchong pushed a commit to branch release-1.0
in repository https://gitbox.apache.org/repos/asf/fluss.git
commit 6f13a4b229fd658e0aa9912267bf55073c2034f9
Author: Jark Wu <ja...@apache.org>
AuthorDate: Thu Sep 17 15:37:04 2026 +0800
[license] Correct bundled Protobuf license declarations
The shipped Protobuf Java
versions use BSD-3-Clause, but LICENSE-bin and the InfluxDB plugin NOTICE
classified them as Apache-2.0. Correct the top-level declaration, identify
the bundled versions and package-local license paths, move the plugin's
Protobuf dependencies into the BSD group, and include the complete upstream
license in the independently distributed plugin JAR.
Co-Authored-By: Codex <no...@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 49/49
AI-Contributed/UT: 0/0
---
LICENSE-bin | 9 ++++--
.../src/main/resources/META-INF/NOTICE | 8 ++++--
.../META-INF/licenses/LICENSE.protobuf-java | 32 ++++++++++++++++++++++
3 files changed, 44 insertions(+), 5 deletions(-)
diff --git a/LICENSE-bin b/LICENSE-bin
index 5616dec88..13af599db 100644
--- a/LICENSE-bin
+++ b/LICENSE-bin
@@ -444,9 +444,12 @@ License: Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.
------------------------------------------------------------------------------------
-This product bundles Protobuf Java.
-Project URL: http://code.google.com/p/protobuf
-License: Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt
+This product bundles Protobuf Java 3.19.6, 3.25.5 and 4.33.5.
+Project URL: https://github.com/protocolbuffers/protobuf
+License: BSD 3-Clause
+See META-INF/licenses/LICENSE.protobuf-java in plugins/hdfs/fluss-fs-hdfs-*.jar
+and plugins/influxdb/fluss-metrics-influxdb-*.jar, and
+META-INF/licenses/LICENSE.protobuf in plugins/paimon/paimon-bundle-2.0.0.jar.
------------------------------------------------------------------------------------
diff --git a/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/NOTICE b/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/NOTICE
index 3f5a5e367..29e01a9dd 100644
--- a/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/NOTICE
+++ b/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/NOTICE
@@ -13,8 +13,6 @@ This project bundles the following dependencies under the Apache Software Licens
- com.google.guava:failureaccess:1.0.3
- com.google.guava:guava:33.5.0-jre
- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
-- com.google.protobuf:protobuf-java-util:4.30.2
-- com.google.protobuf:protobuf-java:4.33.5
- io.grpc:grpc-api:1.71.0
- io.grpc:grpc-context:1.71.0
- io.grpc:grpc-core:1.71.0
@@ -58,3 +56,9 @@ This project bundles the following dependencies under the MIT License.
See META-INF/licenses/LICENSE.influxdb3-java for the license text.
- com.influxdb:influxdb3-java:1.8.0
+
+This project bundles the following dependencies under the BSD 3-Clause license.
+See META-INF/licenses/LICENSE.protobuf-java for the license text.
+
+- com.google.protobuf:protobuf-java-util:4.30.2
+- com.google.protobuf:protobuf-java:4.33.5
diff --git a/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/licenses/LICENSE.protobuf-java b/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/licenses/LICENSE.protobuf-java
new file mode 100644
index 000000000..19b305b00
--- /dev/null
+++ b/fluss-metrics/fluss-metrics-influxdb/src/main/resources/META-INF/licenses/LICENSE.protobuf-java
@@ -0,0 +1,32 @@
+Copyright 2008 Google Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Code generated by the Protocol Buffer compiler is owned by the owner
+of the input file used when generating it. This code is not
+standalone and requires a support library to be linked with it. This
+support library is itself covered by the above license.
(fluss) 04/07: [license] Retain notices for copied Arrow Spark and Netty code
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
wuchong pushed a commit to branch release-1.0
in repository https://gitbox.apache.org/repos/asf/fluss.git
commit 3cc37f5a45566fa488d05e55438ebaac1eb9c6f5
Author: Jark Wu <ja...@apache.org>
AuthorDate: Thu Sep 17 15:37:10 2026 +0800
[license] Retain notices for copied Arrow Spark and Netty code
Copied Arrow compression classes, Spark NettyLogger
and the Netty MERGE_CUMULATOR implementation were missing applicable source
attributions. Preserve the project notices and list the Netty-derived
source in LICENSE. Limit these notices to the copied code rather than
importing unrelated optional dependencies from upstream distributions.
Co-Authored-By: Codex <no...@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 21/21
AI-Contributed/UT: 0/0
---
LICENSE | 3 +++
NOTICE | 18 ++++++++++++++++++
2 files changed, 21 insertions(+)
diff --git a/LICENSE b/LICENSE
index 6d27948e9..9a17cf6bd 100644
--- a/LICENSE
+++ b/LICENSE
@@ -395,6 +395,9 @@ Apache Paimon
Apache Spark
./fluss-rpc/src/main/java/org/apache/fluss/rpc/netty/NettyLogger.java
+Netty
+./fluss-rpc/src/main/java/org/apache/fluss/rpc/netty/NettyChannelInitializer.java
+
LightProto
./fluss-common/src/main/java/org/apache/fluss/utils/ProtoCodecUtils.java
./fluss-protogen/fluss-protogen-maven-plugin/src/main/java/org/apache/fluss/protogen/maven/plugin/ProtoGenMojo.java
diff --git a/NOTICE b/NOTICE
index 993dc96f7..eef212cbc 100644
--- a/NOTICE
+++ b/NOTICE
@@ -13,6 +13,24 @@ Copyright 2012-2024 The Apache Software Foundation
Apache Paimon
Copyright 2023-2024 The Apache Software Foundation
+Apache Arrow Java
+Copyright 2016-2025 The Apache Software Foundation
+
+Apache Spark
+Copyright 2014 and onwards The Apache Software Foundation.
+
+----------------------------------------------------------
+
+The HeapPreferringCumulator in NettyChannelInitializer.java is derived from
+Netty 4.1's MERGE_CUMULATOR, with the following attribution:
+
+The Netty Project
+Copyright 2014 The Netty Project
+
+https://netty.io/
+
+Licensed under the Apache License, Version 2.0.
+
----------------------------------------------------------
This project includes code from Project LightProto, developed at Splunk,